所以我遇到了一个奇怪的问题,我找不到一个解释。我有一个异步任务,在它的doBackground方法做一个等待,直到一个特定的变量设置,然后"等待"被通知
private class TestAsyncTask extends AsyncTask<Void, Object, Boolean> {
@Override
protected void onPreExecute() {
Log.d("Test1");
}
@Override
protected Boolean doInBackground(Void... params) {
Log.d("Test2");
while (nextCardToPlay == null) {
wait();
}
Log.d("Test3");
}
}
活动一:
protected void onCreate(){
a = new TestAsyncTask().execute();
}
protected void onPause(){
a.cancel()
}
因此,正如您所看到的,当活动启动时,asyncTask启动。当activity关闭时,asyncTask应该被取消。
我注意到的是,如果我打开活动,关闭它,并再次重新打开它,那么asynctask被创建并处于等待模式(从未取消)。没有问题。令人困惑的是,当我启动活动(而陈旧的asyncTask在那里),那么似乎是一个新的asyncTask启动(因为从OnPreExecute日志被调用)然而,在nextAsyncTask的doInBackground没有执行,因为Test2日志没有显示。
知道为什么吗?
如果你看一下文档,这种行为一点也不奇怪,它说明AsyncTasks
在单个后台线程上运行,即顺序运行。如果你真的希望你的任务在并行工作线程上运行,那么使用executeOnExecutor()
方法而不是简单的execute()
,并传递AsyncTask.THREAD_POOL_EXECUTOR
参数。