Подтвердить что ты не робот

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() не вызывается.

Есть ли у кого-то одна проблема или она знает, как проблема?

Спасибо

4b9b3361

Ответ 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 только один раз. Я предполагаю, что вы пытаетесь запустить их несколько раз.

Создайте еще один экземпляр и повторите попытку.

Если это не работает, проверьте лог-код и разместите его здесь, если этого недостаточно, чтобы исправить его.