android - 异步任务 : doInBackground not called

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

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

谢谢

最佳答案

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

我没有使用 *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* 无法管理我提供的尽可能多的 asyncTask。

谢谢大家

关于android - 异步任务 : doInBackground not called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16832376/

相关文章:

Google Play 中的 Android 错误 "The application icon is not valid. Use a 48x48 PNG file."

java - Android 在发出多个 http 请求时增加堆 fragment 情况

android - 从 Volley/AsyncTask 返回值到调用方法

android - 如何从 Android 以有限的时间间隔轮询 Web 服务?

java - 来自代码本身的 Android TTS - 而非用户输入

android -/apex/com.android.runtime/lib64/bionic/libc.so (abort+160),在 Android 10 设备中中止崩溃

android - onPostExecute() 无法重新运行从 Activity 调用的 asyncTask

java - 错误: unreported exception InterruptedException; must be caught or declared to be thrown (calling AsyncTask)

java - Android - 使用 Callable 进行联网

android - 从 SQLite 返回一个 int 结果