AsyncTask: doInBackground не вызывается
У меня проблема с 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()
не вызывается.
Есть ли у кого-то одна проблема или она знает, как проблема?
Спасибо
Ответы
Ответ 1
Наконец, я нашел решение проблемы.
Вместо выполнения asyncTask с помощью * AsyncTask.THREAD_POOL_EXECUTOR *, я создаю собственный ThreadPoolExecutor с большим значением corePoolSize и maximumPoolSize:
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 столько, сколько я ему дал.
Спасибо, ребята,
Ответ 2
Это случилось со мной однажды, потому что некоторые из моих задач были заблокированы в doInBackground()
(что, очевидно, невозможно с помощью вставленного образца кода).
Размер пула по умолчанию для Android для THREAD_POOL_EXECUTOR был 5 в последний раз, когда я проверил. Поэтому, если вы выполняете более 5 задач одновременно, следующие будут ждать завершения задачи.
Это единственный случай, который я знал, чтобы предотвратить вызов doInBackground()
.
Ответ 3
Ваш код выглядит хорошо.
Вы можете запускать задачи async только один раз. Я предполагаю, что вы пытаетесь запустить их несколько раз.
Создайте еще один экземпляр и повторите попытку.
Если это не работает, проверьте лог-код и разместите его здесь, если этого недостаточно, чтобы исправить его.