gpt4 book ai didi

即使使用线程池,Android Cordova 插件也会锁定 UI 线程

转载 作者:太空狗 更新时间:2023-10-29 13:21:20 26 4
gpt4 key购买 nike

我已经编写了一个 Cordova 插件,可以在 Android 上调整图像大小,但是在翻动大量图像(超过 100 张)时 UI 会锁定,直到翻动停止。我正在对 theadPool 执行所有的大小调整,最初只有一个可运行的,但在阅读了这篇关于 Cordova Plugins and Thread Blocking 的博客文章之后我改用外部类(class)来完成这项工作。但是我仍然得到:

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

除了传入的 photoData 对象,GetImageRunnable 没有指向主插件的链接。有什么方法可以查看导致速度变慢或阻塞主线程的原因吗?

最佳答案

你可以试试下面的代码,它使用了最小的 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;
}
}

注意:这没有经过测试,代码只是为了说明想法。

关于即使使用线程池,Android Cordova 插件也会锁定 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28377407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com