AsyncTask:未调用doInBackground

时间:2013-05-30 09:23:47

标签: android android-asynctask

我对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()

有人有同样的问题或者知道问题是怎么回事?

谢谢

3 个答案:

答案 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并在此处发布,如果它不足以让您修复它。