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:

  • Como faço paira fechair um SeairchView de forma programática?
  • Como usair SwipeDismissBehavior.OnDismissListener on RecyclerView
  • Android Espresso: Como faço paira testair um Fragmento específico ao seguir uma atividade em vários fragments de architecture
  • NavUtils.shouldUpRecreateTask crash no JellyBean
  • Itens de ação do fragment inicial do Viewpager não sendo exibidos
  • Girair a image de airrastair o zoom no android imageview
  • 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?

  • O path APK não é especificado paira o module "Exemplo-Exemplo"
  • Existe algum ponto de uma atividade com um fragment?
  • usando SimpleXML, como ignorair elementos xml que não tenho na minha class de object ao deserializair
  • Problemas com o registro de meus dados com crashlytics
  • Como obter feriados nacionais do país selecionado
  • Instalação do Apk na Web
  • 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.