我为你提供Android插件文档中的线程部分翻译:
这些插件都是异步的,当你调用它们时,会得到一个成功或失败的回调。如果本地任务太长,线程只是为了不阻塞UI。
引用如下:
线程
插件的JavaScript不在WebView接口的主线程中运行;相反,它在WebCore线程上运行,execute方法也是如此。如果需要与用户界面交互,您应该使用以下变体:
@Override
public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
if ("beep".equals(action)) {
final long duration = args.getLong(0);
cordova.getActivity().runOnUiThread(new Runnable() {
public void run() {
...
callbackContext.success();
}
});
return true;
}
return false;
}
如果您不需要在主界面线程上运行,但也不想阻塞WebCore线程,请使用以下内容:
@Override
public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
if ("beep".equals(action)) {
final long duration = args.getLong(0);
cordova.getThreadPool().execute(new Runnable() {
public void run() {
...
callbackContext.success();
}
});
return true;
}
return false;
}
http://docs.phonegap.com/en/3.5.0/guide_platforms_android_plugin.md.html#Android%20Plugins
Kevin的说明:
调用CallbackContext
方法最终会调用CordovaWebView#sendPluginResult(PluginResult cr, String callbackId)
。在CordovaWebViewImpl
中实现该方法时,会调用NativeToJsMessageQueue#addPluginResult(cr, callbackId)
,最终导致在同步块内添加一个元素到LinkedList
中。所有对该List
的访问都是同步的。
execute(...)
的契约指定的保证。 - Kevin KrumwiedeCallbackContext
方法的调用最终会调用CordovaWebView#sendPluginResult(PluginResult cr, String callbackId)
。在CordovaWebViewImpl
中实现该方法时,会调用NativeToJsMessageQueue#addPluginResult(cr, callbackId)
,这最终导致在synchronized
块内添加一个元素到LinkedList
中。所有对该列表的访问都是同步的(除了一个——我会提交一个bug)。 - Kevin KrumwiedecallbackContext.success()
总是线程安全的,并且将在 UI 线程上运行? - Nathan HrunOnUiThread
。无论如何,callbackContext.success();
通常不需要花费很长时间运行(除非您返回一个大值),您需要担心阻止UI的代码是插件执行的其余代码。 - jcesarmobile