我正在尝试编写一个 Cordova 插件,它将启动一个线程来定期收集信息。
其中一个信息是在 js 层维护的。所以我需要提供一个js getter函数来由 native 代码调用。
这里是演示代码:
in js:
var getInfo = function() {
xxxxxxxxxxxxxxx
return jsInfo;
}
// call my plugin
cordova.startCollectInfo(getInfo)
如何让java代码调用getInfo
并获取jsInfo的值?
最佳答案
如果将 getInfo()
函数作为成功回调传递给原生插件层,则可以使用 setKeepCallback(true)
来阻止 Cordova 丢弃对第一次调用后的 JS 回调,然后存储对回调上下文的引用,允许您多次调用 JS 回调以响应调用的 native 线程操作。像这样的事情:
myplugin.js:
var getInfo = function(jsInfo) {
xxxxxxxxxxxxxxx
return jsInfo;
}
var getInfoError = function(error){
console.error("An error occurred: " + error);
}
// call my plugin
cordova.exec(getInfo,
getInfoError,
'MyPlugin',
'startCollectInfo',
[]);
MyPlugin.java
public class MyPlugin extends CordovaPlugin{
private CallbackContext getInfoCallbackContext;
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("startCollectInfo")){
this.getInfoCallbackContext = callbackContext;
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
callbackContext.sendPluginResult(r);
}
return true;
}
public void onSomeThreadOperationResult(String[] someResults){
String jsInfo = convertToJson(someResults);
PluginResult r = new PluginResult(PluginResult.Status.OK, jsInfo);
r.setKeepCallback(true);
this.getInfoCallbackContext.sendPluginResult(r);
}
}
关于cordova 插件 - 将 js 函数传递给 native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37917460/