2015-02-07 43 views
3

我已经编写了一个Cordova插件,用于在Android上对图像进行图像大小调整,但UI会在大量图像(超过100个)翻牌停止。我在theadPool上执行所有的调整大小,最初只是一个可运行的,但在阅读Cordova Plugins and Thread Blocking的博客文章后,我切换到了一个外部类来完成这项工作。但是我仍然得到:即使使用线程池,Android Cordova Plugin也会锁定UI线程

W/PluginManager﹕ THREAD WARNING: exec() call to ImageStore.getImage blocked the main thread for 91ms. Plugin should use CordovaInterface.getThreadPool(). 

对于调整每个图像,调用看起来是这样的:

private boolean getImage(final JSONArray args, final CallbackContext callbackContext) throws JSONException { 

    JSONObject argObject = args.getJSONObject(0); 

    int photoId = argObject.getInt("photoId"); 
    final PhotoData photoData = mPhotos.get(photoId); 

    cordova.getThreadPool().execute(new GetImageRunnable(photoData, callbackContext)); 

    return true; 
} 

凡GetImageRunnable没有联系,只是传入的photoData对象主要插件有什么方法可以查看导致减速或阻塞主线程的原因?

+0

我会尝试使用AsyncTask并忽略CordovaInterface的看似有问题的功能。 (其他人似乎也有这个问题)。 – vbence 2015-02-23 16:44:45

+0

@vbence添加此作为答案,如果可能的话提供某种示例,我会将其标记为已接受... – 2015-02-23 17:19:14

回答

1

你可以给下面的代码一试,它使用了最少的AsyncTask运行GetImageRunnable

private boolean getImage(final JSONArray args, final CallbackContext callbackContext) throws JSONException { 

    JSONObject argObject = args.getJSONObject(0); 

    int photoId = argObject.getInt("photoId"); 
    final PhotoData photoData = mPhotos.get(photoId); 

    (new MyTask(photoData, callbackContext)).execute(); 

    return true; 
} 

private class MyTask extends AsyncTask<Void, Void, Void> { 

    private PhotoData mPhotoData; 
    private CallbackContext mCallbackContext; 

    public MyTask(PhotoData photoData, CallbackContext callbackContext) { 
     mPhotoData = photoData 
     mCallbackContext = callbackContext; 
    } 

    protected Void doInBackground(Void... v) { 
     (new GetImageRunnable(photoData, callbackContext)).run(); 
     return null; 
    } 

    protected void onProgressUpdate(Void... v) { 
    } 

    protected void onPostExecute(Void v) { 
    } 
} 

它留下的东西虽然不理想;该回调将在后台线程中运行。如果你需要在主线程中运行,您可以掩盖初始CallbackContext(这是不是最后一次),并将结果传递到原来的onPostExecute

private boolean getImage(final JSONArray args, final CallbackContext callbackContext) throws JSONException { 

    JSONObject argObject = args.getJSONObject(0); 

    int photoId = argObject.getInt("photoId"); 
    final PhotoData photoData = mPhotos.get(photoId); 

    (new MyTask(photoData, callbackContext)).execute(); 

    return true; 
} 

private class MyTask extends AsyncTask<Void, Void, Void> { 

    private PhotoData mPhotoData; 
    private CallbackContext mCallbackContext; 
    private CallbackContext mMaskedContext; 

    public MyTask(PhotoData photoData, CallbackContext callbackContext) { 
     mPhotoData = photoData 
     mCallbackContext = callbackContext; 
     mMaskedContext = new MyCallbackContext(callbackContext); 
    } 

    protected Void doInBackground(Void... v) { 
     (new GetImageRunnable(photoData, mMaskedContext)).run(); 
     return null; 
    } 

    protected void onProgressUpdate(Void... v) { 
    } 

    protected void onPostExecute(Void v) { 
     mCallbackContext.sendPluginResult(mMaskedContext.getPluginResult()); 
    } 
} 

class MyCallbackContext extends CallbackContext { 
    private CallbackContext mOriginalContext; 
    private PluginResult mPluginResult; 

    public MyCallbackContext(CallbackContext originalContext) { 
     super(originalContext.getCallbackId(), null); 
     mOriginalContext = originalContext; 
    } 

    public void sendPluginResult(PluginResult pluginResult) { 
     mPluginResult = pluginResult; 
    } 

    public pluginResult getPluginResult() { 
     return mPluginResult; 
    } 
} 

注:这是不是经过测试,代码只是为了说明这些想法。