java - Cordova:如何编写可以重复调用 Javascript 回调的 native 插件?

标签 java android cordova plugins

在开发 Cordova 插件时,我找到的所有教程都是这样的:

文件:AwesomePlugin.js

var AwesomePlugin = {
  kungfuGripAction = function(target, successCallback, failureCallback) {
    return cordova.exec(
      successCallback,
      failureCallback,
      'AwesomePluginClass',
      'kungfuGripAction',
      [target]
    );
  }
};

module.exports = AwesomePlugin;

文件:AwesomePluginClass.java

@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if (ACTION_KUNGFU_GRIP.equals(action)) {
        JSONObject target = args.getJSONObject(0);
        if (gripTarget(target)) {
            callbackContext.success("Target successfully gripped.");
            return true;
        } else {
            callbackContext.error("Could not grip target.");
            return false;
        }
    }

    Log.d(LOG_TAG, "INVALID ACTION! " + action);
    callbackContext.error("Invalid action: " + action);
    return false;
}

文件:clientCode.js

AwesomePlugin.kungfuGripAction(cobraEnemy, function(ok) { }, function(err) { });

在上面的代码中,回调只能被调用一次,然后被释放。如果您尝试调用回调上下文对象的 .success().error() 方法,它将不起作用,您将收到一条日志消息:

Attempted to send a second callback for ID: AwesomePlugin2982699494<BR>W/CordovaPlugin(976) Result was: "Target successfully gripped."

似乎不可能编写一个可以重复调用的回调方法,因为 .success().error() 是唯一的方法记录了从 native 插件代码中调用回调的方法。虽然这主要是我们想要的,但有时我们希望让插件重复执行回调。例如:

AwesomePlugin.kungfuGripAction(cobraEnemy, function(ok) {
  // After successful grip, punch repeatedly and update life meter.
  AwesomePlugin.punchRepeatedly(cobraEnemy, function(hits) {
    updateLifeMeter(cobraEnemy, hits);
  }, function(err) { });
}, function(err) { });
上面的

AwesomePlugin.punchRepeatedly() 将重复执行(可能在单独的线程中)并在每次成功执行时调用 function(hits)。如果以实际方式实现(使用一次性回调),则必须使用循环(这很糟糕,因为它是非异步的)或尾调用 AwesomePlugin.punchRepeatedly()在回调中(容易出错)。

在 native 代码中实现 punchRepeatedly() 的正确方法是什么,以便它能够注册一次回调然后重复执行它?

最佳答案

我认为,您可以使用 pluginResult 并将 keepCallback 属性设置为 true

PluginResult result = new PluginResult(PluginResult.Status.OK, "YOUR_MESSAGE");
// PluginResult result = new PluginResult(PluginResult.Status.ERROR, "YOUR_ERROR_MESSAGE");
result.setKeepCallback(true);
callbackContext.sendPluginResult(result);

您应该能够通过这种方式多次调用回调。

关于java - Cordova:如何编写可以重复调用 Javascript 回调的 native 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25483286/

相关文章:

Android Studio 主题编辑器不显示预览

android - MapFragment getMap() 返回 null (mapBox)

android - 带有 Cordova 的 jsPDF - 添加图像

html - iOS 11,Cordova 应用侧边栏在滚动时消失

java - 掷骰子,有 50% 的几率掷出 6

java - 如何将 JUnit 5 与 build.gradle.kts 和 kotlin 一起使用?

javascript - 如何将整个javascript函数注入(inject)webview并从android调用它

android - Tap/Touch 事件不适用于 Samsung Android 4.4.4 和 5

java - 在两个未排序的数组中查找公共(public)元素

java组合