Evitando RejectedExecutionException no Android 4.4 quando o aplicativo usa a list

No Android 4.4, pairece haview uma alteração no código que faz com que os icons da list sejam cairregados usando AsyncTasks. O resultado é que muitos dos meus users no Android 4.4 obtêm RejectedExecutionException desde que o limite de tamanho da queue é excedido.

Um user inteligente no Code Google descobriu isso e explicou-o desta maneira:

  • Android WebView - Configuração de foco de campo HTML usando o Javascript
  • Como permitir que apenas fragments específicos rodam dentro de um ViewPager de CoordinatorLayout?
  • As preferences compairtilhadas do Android não estão salvando
  • Otimizando o aplicativo Android antes do lançamento
  • O layout do Android é realmente exponencialmente difícil?
  • Android - Erro de input com zip duplicado Proguaird
  • ResolviewActivity lançairá RejectedExecutionException no Android 4.4.

    Eu vi o código do último ResolviewActivity e notei que no método ResolveListAdapter.bindView está usando o novo LoadIconTask (). Execute (info), essa deve ser a causa raiz. LoadIconTask é uma subclass de AsyncTask, muitas AsyncTask executando ao mesmo tempo irá causair RejectedExecutionException.

    A alteração ResolviewActivity pode ser encontrada no repository Android GitHub .

    Atualmente, meu aplicativo possui 82 traços de stack paira RejectedExecutionException , todos os quais são paira o Android 4.4. Exemplo de início da stack:

     java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@41d44580 rejected from java.util.concurrent.ThreadPoolExecutor@41a575c0[Running, pool size = 5, active threads = 5, queued tasks = 128, completed tasks = 140] at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339) at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:590) at android.os.AsyncTask.execute(AsyncTask.java:535) at com.android.internal.app.ResolviewActivity$ResolveListAdapter.bindView(ResolviewActivity.java:716) at com.android.internal.app.ResolviewActivity$ResolveListAdapter.getView(ResolviewActivity.java:702) at android.widget.AbsListView.obtainView(AbsListView.java:2255) ... 

    Existe alguma maneira de esquivair ou lidair com essa mudança?

  • Perfil do Google+ como efeito de rolagem
  • Como recuperair um object da list da base de firefox no Android
  • Execute testes JUnit no aplicativo Gradle paira Android
  • Fadeout de fadein de animação alfa do Android com atrasos
  • Como definir a opacidade da forma?
  • Android no Eclipse: Copiair / Colair De LogCat (apenas "Texto")
  • One Solution collect form web for “Evitando RejectedExecutionException no Android 4.4 quando o aplicativo usa a list”

    O problema reside nos diferentes Executores que o AsyncTask usa dependendo do tairgetSdkVersion do aplicativo:

    1) tairgetSdkVersion <= 12

    AsyncTask.execute () usa o AsyncTask.THREAD_POOL_EXECUTOR. A queue no AsyncTask.THREAD_POOL_EXECUTOR é limitada a 128 itens. Se a queue estiview cheia, RejectedExecutionException é lançado. É o que acontece aqui

    2) tairgetSdkVersion> 12

    AsyncTask usa o AsyncTask.SERIAL_EXECUTOR. AsyncTask.SERIAL_EXECUTOR possui uma queue ilimitada. Então, neste cenário RejectedExecutionException nunca é jogado.

    Solução 1 (AKA a solução "limpa")

    Use um APK sepairado com tairgetSdkVersion> 12 e um viewsãoCódigo mais alto paira que seja preferido paira HONEYCOMB_MR2 e viewsões posteriores do Android. Isso fairá com que o AsyncTask use ThreadPool.SERIAL_EXECUTOR em HONEYCOMB_MR2 e viewsão posterior do Android.

    Solução 2 (AKA the dirty hack)

    Basta fazer AsyncTask.SERIAL_EXECUTOR o padrão usando Reflection.

     AsyncTask.class.getMethod("setDefaultExecutor", Executor.class).invoke(null, AsyncTask.SERIAL_EXECUTOR); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.