Javascript和PhoneGap的插件之间的异步通信插件、通信、Javascript、PhoneGap

2023-09-12 22:53:09 作者:巭孬嫑勥茓

所以,大家都知道,我们做一个类扩展 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 the WiFi events using the WifiManager class. Registered the receiver. And finally, popping a Toast when WiFi is enabled/disabled, and sending the result using CallbackContextcallbackContext.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:

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;
            }
        }
    }
}
 
精彩推荐
图片推荐