所以,每个人都知道我们创建了一个扩展 CordovaPlugin
的类并覆盖 execute()
,然后在 JS 和 native Java(对于 Android)之间建立了一座桥梁。此外,我们使用 PluginResult
将结果返回给 JS。
所以,所有这些都发生在从 JS 向 Java 插件发出请求时。我的问题是,如何将结果发送回 JS(因此发送回 HTML)异步?
我不知道这个词是否 < strong>异步就在这里。问题是我想突然向 JS 发送一些东西(比如,当 wifi 变为启用/禁用时)。
我已经对此进行了研究,但没有任何适合我的情况。
我试过的是-
- 使用
WifiManager
类创建了一个BroadcastReceiver
监听WiFi
事件。 - 注册了接收者。
- 最后,在
WiFi
启用/禁用时弹出Toast
,并使用CallbackContext
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Wifi 已连接"))
和用于断开连接的其他消息。
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"));
}
}
}
}
Toast
弹出,但 PluginResult
没有发送到 JS。
PS : 监听 WiFi 事件不是我的实际问题,我想在 Phonegap 中复制 Android 蓝牙聊天
应用程序。因此,它本质上必须是异步的。
最佳答案
您快到了,但您需要在 PluginResult 上将KeepCallback 设置为 true。如果不这样做,Java 端的后续结果将不会在 JavaScript 端有回调。这种类型的编码最好的例子是 Cordova 核心中的网络插件。以下是来源链接:
所以你应该更新你的代码:
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;
}
}
}
}
关于java - Javascript 和 Phonegap 插件之间的异步通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19177991/