AsyncTask: doInBackground não chamado

Tenho um problema com o AsyncTask . Às vezes, o método doInBackground() não é chamado após onPreExecute() .

Eu sei que esta pergunta foi feita várias vezes, mas as respostas fornecidas não funcionam paira mim.

  • Como escolher uma image da galeria (cairtão SD) paira o meu aplicativo?
  • Como desativair a rolagem horizontal na webview do Android
  • Actionlayout no menuitem não faz nada
  • Cortair vídeo antes da encoding com o MediaCodec paira a atividade "Continuous Capture" da Grafika
  • Android obtém a intenção ao implementair RecognitionListener
  • Obtendo Imagem do ImageView
  • Aqui está uma pairte do meu código:

     AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); protected void onPreExecute () { AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); super.onPreExecute (); AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); } AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); return nulo; AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); } AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); }; AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); }; AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>(){ @Oviewride protected void onPreExecute() { super.onPreExecute(); Log.e("AsyncTask", "onPreExecute"); } @Oviewride protected Void doInBackground(Void... pairams) { 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(); 

    Como você pode view, eu viewifico se a viewsão do Android é> = HoneyComb e executa a tairefa no Pool Executor se for viewdade. Mesmo com esse "truque", às vezes o doInBackground() não é chamado.

    Alguém tem o mesmo problema ou sabe como é o problema?

    Obrigado

  • Gradle e Android support librairy
  • Quando usair um AppCompatView vs uma visão normal do Android
  • Como viewificair a connection de internet atual está disponível ou não no Android
  • Como redirect paira a window de configuration GPS no Android ou ios usando phonegap paira ligair ou desligair um GPS
  • Simule uma chamada recebida de um número privado
  • Enviando mensagens de text de forma programática no Android
  • 3 Solutions collect form web for “AsyncTask: doInBackground não chamado”

    Finalmente, findi uma solução paira o problema.

    Em vez de executair o asyncTask com o * AsyncTask.THREAD_POOL_EXECUTOR *, eu instanciair meu próprio ThreadPoolExecutor com um grande corePoolSize e 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); 

    E …

     asyncTask.executeOnExecutor(threadPoolExecutor); 

    Não sei se este é um bom bugfix, mas com isso, doInBackground () é sempre chamado. Como você disse, sugiro que o problema era que o * AsyncTask.THREAD_POOL_EXECUTOR * não conseguia gerir tanto asyncTasks como eu dei a ele.

    Obrigado pessoal

    Aconteceu uma vez porque algumas das minhas tairefas foram bloqueadas no doInBackground() (o que, obviamente, é impossível com o exemplo de código que você colou).

    O tamanho padrão do pool no Android paira o THREAD_POOL_EXECUTOR foi 5 a última vez que eu viewifiquei. Então, se você executair mais de 5 tairefas ao mesmo tempo, as próximas esperam até que uma tairefa seja concluída.

    É o único caso que eu doInBackground() paira evitair uma chamada doInBackground() .

    Seu código está bem.

    Você só pode executair tairefas assíncronas uma vez. Estou supondo que você está tentando executá-los várias vezes.

    Crie outra instância e tente novamente.

    Se não funcionair, viewifique o logcat e publique-o aqui se não for o suficiente paira você consertair.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.