当前位置: 首页 > 面试题库 >

Javascript和Phonegap插件之间的异步通信

葛嘉悦
2023-03-14
问题内容

因此,每个人都知道我们制作了一个Class来扩展CordovaPlugin和覆盖
execute(),然后在JS和本地Java(对于Android)之间建立了桥梁。进一步,我们使用PluginResult返回结果返回给JS。

因此,所有这些都发生在从JS向Java插件发出请求的情况下。我的问题是, 如何将结果 异步 发送回JS (进而 发送回
HTML)

我不知道 异步 一词在这里。事情是我想发回一些东西到JS(例如,当wifi启用/禁用时)。

我已经对此进行了研究,但没有适合我的情况的任何东西。

我尝试过的是-

  • 使用该类创建了事件BroadcastReceiver监听。 WiFi``WifiManager
  • 注册接收者。
  • 最后,弹出一个ToastWiFi启用/禁用,并且发送使用结果 CallbackContext

callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Wifi Connected")),并与不同的消息断开。

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事件不是我的实际问题,我想Android Bluetooth Chat在Phonegap中复制该应用程序。因此,它本质上必须是异步的。


问题答案:

您快到了,但是需要在PluginResult上将KeepCallback设置为true。如果您不这样做,那么Java端的后续结果将不会在JavaScript端进行回调。此类编码的最佳示例是Cordova核心中的Network插件。这是到源的链接:

https://git-wip-us.apache.org/repos/asf?p=cordova-plugin-network-
information.git;a=blob;f=src/android/NetworkManager.java;h=e2ac500ccc885db641d5df6dab8eae23026a5828;hb=头

因此,您应该将代码更新为:

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;
            }
        }
    }
}


 类似资料:
  • 本文向大家介绍VsCode插件开发之插件初步通信的方法步骤,包括了VsCode插件开发之插件初步通信的方法步骤的使用技巧和注意事项,需要的朋友参考一下 参考了Egret Wing,想像Egret Wing那样在上方titlebar最右边上面增加一个menu(这个menu相对于一个按钮,当点击这个按钮时会出现一个window弹框,这个window弹框里就包含相关的表单信息以供登录或者注册使用。我是以

  • 本文向大家介绍同步和异步时序电路之间的差异,包括了同步和异步时序电路之间的差异的使用技巧和注意事项,需要的朋友参考一下 顾名思义,同步时序电路和异步时序电路都是将反馈用于下一代输出的时序电路的类型,但是根据这种反馈的类型,可以区分两个电路。 以下是同步和异步时序电路之间的重要区别 - 序号 键 同步时序电路 异步时序电路 定义 另一方面,异步时序电路是数字时序电路,其中到下一个生成的输入的反馈不受

  • 我们有一个现有的java代码库,在那里我们使用intellij idea进行开发。 如果我们将Intellij Idea与各种Android支持插件一起使用,这些插件是否与Android Studio中的插件相同?有了这套插件,程序实际上是可以互换的吗? (我确实注意到Android Studio中没有“ant”支持。虽然我所需要的只是一些从IDE调用可执行文件的能力,其中包含一组菜单可配置项,用

  • 本文向大家介绍同步和异步传输之间的区别,包括了同步和异步传输之间的区别的使用技巧和注意事项,需要的朋友参考一下 在数字电子设备中,同步传输和异步传输都是串行数据传输的一种类型,其中,基于用于同步的时钟脉冲,数据在发送方和接收方之间进行传输。 以下是同步传输和异步传输之间的重要区别- 序号 键 同步传输 异步传输 1 定义 同步传输是一种传输类型,其中在发送器和接收器之间共享一个公共时钟脉冲以允许同

  • 本文向大家介绍同步和异步计数器之间的区别,包括了同步和异步计数器之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,在数字电子学中,计数器是由一系列触发器组成的顺序逻辑电路,用于按负或正边沿跳变来计数输入出现的次数。现在,基于触发器的触发方式,我们可以区分同步计数器和异步计数器。 以下是同步计数器和异步计数器之间的重要区别。 序号 键 同步计数器 异步计数器 1 触发 顾名思义,在使用同

  • 问题内容: 事件驱动和异步通常用作同义词。两者之间有什么区别吗? 另外,和之间有什么区别?它们如何配合在一起? 最后,我读过很多遍了,Linux中的AIO被严重破坏了。它到底有多坏? 谢谢。 问题答案: 事件是实现异步执行的范例之一。但是,并非所有异步系统都使用事件。那是关于这两个的语义含义-一个是另一个的超实体。 epoll和aio使用不同的隐喻: epoll是一个阻塞操作()-阻塞线程直到发生