我有一段代码使用 AsyncTask 在后台运行。代码与此类似:
private class MyAsyncTask extends AsyncTask<Void, Void, Object> {
public MyAsyncTask() {
// Some init. code
}
@Override
protected Object doInBackground(Void... params) {
// Doing some long running task.
Log.v(TAG, "Finished everything. Returning ...");
return result;
}
@Override
protected void onCancelled(Object result) {
// Either way, run the next one in the line.
Log.v(TAG, "Task cancelled");
}
@Override
protected void onPostExecute(Object result) {
Log.v(TAG, "Task Completed.");
}
}
在 Android 4 上它工作得很好,但是当我在 2.3 上运行它(HTC Wildfire 是我目前唯一的测试手机)时,不会调用 onPostExecute。
我可以看到来自 的最后一条消息doInBackground
,但没有来自onCancelled
或的消息onPostExecute
。有没有其他人面临同样的问题?我发现这个链接讨论了一个类似的问题,但既没有给出明确的解决方案(只是建议使用普通线程而不是AsyncTask
),也不是我正在寻找的。
有什么建议么?
干杯
编辑1:
好的,在花了一天时间阅读了 , 和 2.3 和 4 的代码之后AsyncTask
,Handler
我Message
现在对正在发生的事情有了更多的线索。
首先多一点关于我的设计。我有一个单例类,它既可以在应用程序中使用,也可以在从我的应用程序启动的某些服务中使用。所以AsyncTask
我上面展示的代码既可以从活动中运行(假设单例是通过活动访问的),也可以从服务中运行(如果单例是通过服务访问的)。
现在在 API 11+ 中,无论单例如何访问,onPostExecute
都可以正常调用。在 API 10 及以下版本中,如果从 Activity 访问单例,则onPostExecute
可以正常调用,但如果通过服务访问,onPostExecute
则不会调用。
这是有关卡住位置的更多详细信息。AsyncTask
在 2.3 上有一个FutureTask
覆盖done
函数以将 a 发送Message
到其内部Handler
,如下所示:
mFuture = new FutureTask<Result>(mWorker) {
@Override
protected void done() {
Message message;
Result result = null;
try {
result = get();
} catch (final InterruptedException e) {
android.util.Log.w(AsyncTask.LOG_TAG, e);
} catch (final ExecutionException e) {
throw new RuntimeException("An error occured while executing doInBackground()",
e.getCause());
} catch (final CancellationException e) {
message = AsyncTask.sHandler.obtainMessage(AsyncTask.MESSAGE_POST_CANCEL,
new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
message.sendToTarget();
return;
} catch (final Throwable t) {
throw new RuntimeException("An error occured while executing "
+ "doInBackground()", t);
}
message = AsyncTask.sHandler.obtainMessage(AsyncTask.MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(AsyncTask.this, result));
message.sendToTarget();
}
};
以下代码的最后两行调用message.sendToTarget
了应该调用handleMessage
的Handler
类,但事实并非如此!现在我不知道为什么对处理程序的回调发生在活动而不是服务中!我有一些解决方案如何解决这个问题(只是在我的代码中始终使用 API15+ 的 AsyncTask 类),但是任何关于这个原因的解释都将非常感激,因为我对此一无所知!
谢谢