我收到以下警告:
THREAD WARNING: exec()
call to MyPlugin.setAndroidPreferences blocked the main thread for 49ms.
Plugin should use CordovaInterface.getThreadPool().
但是从我的代码中我使用cordova.getThreadPool()
:
private boolean setAndroidPreferences(
final JSONArray args,
final CallbackContext callbackContext)
{
cordova.getThreadPool().execute(new Runnable() {
@Override
public void run() {
try {
/* ... */
if ( /* ... */)
{
final SharedPreferences settings = cordova.getActivity().getSharedPreferences(preferenceLib, Context.MODE_PRIVATE);
final SharedPreferences.Editor editor = settings.edit();
editor.putString(preferenceName, preferenceValue);
editor.commit();
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK));
} else { callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR));
}
} catch (JSONException e) {
e.printStackTrace();
Log.e(TAG, "getSetSharePreferences" + ": Error: " + PluginResult.Status.JSON_EXCEPTION);
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
}
}
});
return true;
}
我做错了什么?
谢谢,
答案 0 :(得分:6)
public boolean execute(String action, final JSONArray inputs, final CallbackContext callbackContext) throws JSONException {
if (action.equals("setAndroidPreferences")) {
cordova.getThreadPool().execute(new Runnable() {
@Override
public void run() {
callbackContext.sendPluginResult(setAndroidPreferences(inputs));
}
});
}
}
private PluginResult setAndroidPreferences(JSONArray args) {
try {
if ( /* ... */) {
SharedPreferences settings = cordova.getActivity().getSharedPreferences(preferenceLib, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(preferenceName, preferenceValue);
editor.commit();
return new PluginResult(PluginResult.Status.OK);
} else {
return new PluginResult(PluginResult.Status.ERROR);
}
} catch (JSONException e) {
e.printStackTrace();
Log.e(TAG, "getSetSharePreferences" + ": Error: " + PluginResult.Status.JSON_EXCEPTION);
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
}
}
答案 1 :(得分:0)
您必须使用:
this.cordova.getActivity().runOnUiThread(new Runnable() {...}
而不是:
cordova.getThreadPool().execute(new Runnable() {...}
答案 2 :(得分:0)
这是一个已知的非关键的cordova警告,告诉插件用户, 应该在后台线程中调用低于50毫秒的所有内容。 OCI SDK没有使用cordova线程池, 相反,它使用后台工作线程,该线程已更改为ExecutorTask以用于将来的版本。 您的异步connect()调用已在后台线程中执行,因此它不应阻止您的浏览器线程。 但是OCI插件(Java VM)的初始化和加载机制可能是短时间阻塞的原因。 我们添加了此问题以详细调查阻塞原因 所以我们可以防止科尔多瓦在将来发现这种短暂的情况。 您无法在代码中阻止此警告,并且必须忽略该警告。