Javascript和PhoneGap的插件之间的异步通信 [英] Asynchronous communication between Javascript and Phonegap Plugin
问题描述
所以,大家都知道,我们做一个类扩展 CordovaPlugin
并覆盖执行()
,然后创建一个在JS和本地Java(Android版)之间的桥梁。此外,我们使用 PluginResult
将结果返回到JS。
因此,所有的这种情况发生时,有从JS烧制以Java插件的请求。我的问题是,如何将结果发送回JS (并因此HTML)异步?
我不知道这个词的异步就在这里。问题是我想要的东西送回到JS出蓝色的(例如,当无线成为启用/禁用)。
我已研究了这一点,但还没有得到一个适合我的情况下,任何东西。
我尝试过的事情是 -
So, everybody knows that we make a Class extending CordovaPlugin
and override the execute()
and then creates a bridge between the JS and native Java (for Android). Further we use PluginResult
to return the result back to the JS.
So, all of this happens when there is a request fired from the JS to the Java Plugin. My question is, how to send a result back to JS (and therefore to HTML) asynchronously ?
I don't know if the word asynchronous is right here. The thing is I want to send something back to the JS out of the blue (say, when wifi becomes enable/disable).
I have already researched on this but haven't got anything which suits to my case.
The thing I've tried is -
- 创建一个
的BroadcastReceiver
听使用无线
事件WifiManager
类。 - 中注册的接收器。
- 最后,弹出一个
吐司
在无线
启用/禁用,并使用将结果发送CallbackContext
callbackContext.sendPluginResult(新PluginResult(PluginResult.Status.OK,无线上网 连接))
并断开与不同的消息。
- Created a
BroadcastReceiver
listening to theWiFi
events using theWifiManager
class. - Registered the receiver.
- And finally, popping a
Toast
whenWiFi
is enabled/disabled, and sending the result usingCallbackContext
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Wifi Connected"))
and for disconnected with a different message.
MyPlugin.java
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;
...
public class MyPlugin extends CordovaPlugin {
private WifiReceiver wifiBroadcastReceiver = null;
private CallbackContext callbackContext = null;
...
public MyPlugin() {
wifiBroadcastReceiver = new WifiReceiver();
...
}
...
public boolean execute(String action, final JSONArray args,
final CallbackContext callbackId) throws JSONException {
IntentFilter wifiFilter = new IntentFilter(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
cordova.getActivity().registerReceiver(wifiBroadcastReceiver, wifiFilter);
this.callbackContext = callbackId;
...
}
public class WifiReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
Toast.makeText(cordova.getActivity(), "Wifi Connected", Toast.LENGTH_SHORT).show();
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Wifi Connected"));
} else {
Toast.makeText(cordova.getActivity(), "Wifi Disconnected", Toast.LENGTH_SHORT).show();
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, "Wifi Disconnected"));
}
}
}
}
的吐司
持久性有机污染物,但 PluginResult
不会被发送到JS。
The Toast
pops but the PluginResult
isn't sent to the JS.
PS:听的WiFi事件是不是我的实际问题,我想复制 Android的蓝牙聊天
在PhoneGap的应用程序。因此,它必须是异步的。
PS : Listening to WiFi events isn't my actual problem, I want to replicate the Android Bluetooth Chat
app in Phonegap. So, it has to be asynchronous in nature.
推荐答案
您是几乎没有,但你需要setKeepCallback为true的PluginResult。如果不从Java端所产生的结果将不会对JavaScript端回调。这种类型的编码的最好的例子就是网络插件科尔多瓦核心。这里是一个链接到源:
You are almost there but you need to setKeepCallback to true on your PluginResult. If you don't the subsequent results from the Java side will not have a callback on the JavaScript side. The best example of this type of coding is the Network plugin in Cordova core. Here is a link to the source:
<一个href="https://git-wip-us.apache.org/repos/asf?p=cordova-plugin-network-information.git;a=blob;f=src/android/NetworkManager.java;h=e2ac500ccc885db641d5df6dab8eae23026a5828;hb=HEAD">https://git-wip-us.apache.org/repos/asf?p=cordova-plugin-network-information.git;a=blob;f=src/android/NetworkManager.java;h=e2ac500ccc885db641d5df6dab8eae23026a5828;hb=HEAD
所以,你应该更新code到:
So you should update your code to:
public boolean execute(String action, final JSONArray args,
final CallbackContext callbackId) throws JSONException {
IntentFilter wifiFilter = new IntentFilter(
WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
cordova.getActivity().registerReceiver(wifiBroadcastReceiver,
wifiFilter);
this.callbackContext = callbackId;
PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
result.setKeepCallback(true);
this.callbackContext.sendPluginResult(result);
return true;
}
public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
PluginResult result;
if (intent.getBooleanExtra(
WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
Toast.makeText(cordova.getActivity(), "Wifi Connected",
Toast.LENGTH_SHORT).show();
result = new PluginResult(PluginResult.Status.OK,
"Wifi Connected");
} else {
Toast.makeText(cordova.getActivity(), "Wifi Disconnected",
Toast.LENGTH_SHORT).show();
result = new PluginResult(PluginResult.Status.ERROR,
"Wifi Disconnected");
}
result.setKeepCallback(false);
if (callbackContext != null) {
callbackContext.sendPluginResult(result);
callbackContext = null;
}
}
}
}
这篇关于Javascript和PhoneGap的插件之间的异步通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!