我对AsyncTask
有疑问。有时在doInBackground()
之后不会调用onPreExecute()
方法。
我知道这个问题被多次询问,但给定的答案对我不起作用。
以下是我的代码的一部分:
AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.e("AsyncTask", "onPreExecute");
}
@Override
protected Void doInBackground(Void... params) {
Log.e("AsyncTask", "doInBackground");
return null;
}
protected void onPostExecute(Void result) {
Log.e("AsyncTask", "onPostExecute");
};
};
if(Build.VERSION.SDK_INT >= 11)
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
asyncTask.execute();
如您所见,我检查Android版本是否为&gt; = HoneyComb并在池执行器中执行任务,如果它是真的。
即使有了“技巧”,有时也不会调用doInBackground()
。
有人有同样的问题或者知道问题是怎么回事?
谢谢
答案 0 :(得分:35)
最终我找到了问题的解决方案。
不是使用* AsyncTask.THREAD_POOL_EXECUTOR *执行asyncTask,而是使用大型corePoolSize和maximumPoolSize实现我自己的ThreadPoolExecutor:
int corePoolSize = 60;
int maximumPoolSize = 80;
int keepAliveTime = 10;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(maximumPoolSize);
Executor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue);
而且......
asyncTask.executeOnExecutor(threadPoolExecutor);
我不知道这是否是一个很好的错误修正,但有了这个,总是调用doInBackground()。 正如你所说,我认为问题是* AsyncTask.THREAD_POOL_EXECUTOR *无法像我给它那样管理asyncTasks。
谢谢你们
答案 1 :(得分:2)
我发生过一次,因为我的一些任务在doInBackground()
中被阻止了(使用你粘贴的代码示例显然是不可能的。)
上次检查时,Android上THREAD_POOL_EXECUTOR的默认池大小为5。因此,如果您同时执行5个以上的任务,则下一个任务将等到任务完成。
这是我所知道的阻止doInBackground()
电话的唯一情况。
答案 2 :(得分:0)
您的代码看起来很好。
您只能运行一次异步任务。我猜你试图多次运行它们。
创建另一个实例,然后重试。
如果它不起作用,请检查logcat并在此处发布,如果它不足以让您修复它。