即使在使用CordovaInterface.getThreadPool()之后,Cordova Exec也阻止了主线程

时间:2014-07-05 15:51:45

标签: android cordova

我收到以下警告:

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

我做错了什么?

谢谢,

3 个答案:

答案 0 :(得分:6)

根据http://www.donmarges.io/thread-warning-exec-call-blocked-the-main-thread-plugin-should-use-cordovainterface-getthreadpool-cordova-plugin-warning/尝试以下内容:

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)

reference source

这是一个已知的非关键的cordova警告,告诉插件用户,  应该在后台线程中调用低于50毫秒的所有内容。  OCI SDK没有使用cordova线程池,  相反,它使用后台工作线程,该线程已更改为ExecutorTask以用于将来的版本。  您的异步connect()调用已在后台线程中执行,因此它不应阻止您的浏览器线程。  但是OCI插件(Java VM)的初始化和加载机制可能是短时间阻塞的原因。  我们添加了此问题以详细调查阻塞原因  所以我们可以防止科尔多瓦在将来发现这种短暂的情况。  您无法在代码中阻止此警告,并且必须忽略该警告。