11

我有一个问题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 版本是否 >= HoneyComb,如果为真,则在 Pool Executor 中执行任务。即使有那个“技巧”有时doInBackground()也不会被调用。

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

谢谢

4

3 回答 3

38

最后,我找到了解决问题的方法。

我没有使用 *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* 无法管理我给它的异步任务。

感谢你们

于 2013-05-31T07:00:02.123 回答
2

有一次它发生在我身上,因为我的一些任务被阻止了doInBackground()(这对于您粘贴的代码示例显然是不可能的)。

我上次检查时,Android 上 THREAD_POOL_EXECUTOR 的默认池大小是 5。因此,如果您同时执行超过 5 个任务,则下一个任务将等到一个任务完成。

这是我所知道的唯一阻止doInBackground()通话的情况。

于 2013-05-30T09:51:20.563 回答
0

你的代码看起来不错。

您只能运行一次异步任务。我猜你正在尝试多次运行它们。

创建另一个实例并重试。

如果它不起作用,请检查 logcat 并在此处发布,如果它不足以让您修复它。

于 2013-05-30T09:34:40.010 回答