你可以给下面的代码一试,它使用了最少的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;
}
}
注:这是不是经过测试,代码只是为了说明这些想法。
我会尝试使用AsyncTask并忽略CordovaInterface的看似有问题的功能。 (其他人似乎也有这个问题)。 – vbence 2015-02-23 16:44:45
@vbence添加此作为答案,如果可能的话提供某种示例,我会将其标记为已接受... – 2015-02-23 17:19:14