Avoiding Rejectedexecutionexception In Android 4.4 When App Uses List
Solution 1:
The problem lies with the different Executors that AsyncTask uses depending on targetSdkVersion of the app:
1) targetSdkVersion <= 12
AsyncTask.execute() uses the AsyncTask.THREAD_POOL_EXECUTOR. The queue in AsyncTask.THREAD_POOL_EXECUTOR is limited to 128 items. If the queue is full RejectedExecutionException is thrown. This is what happens here
2) targetSdkVersion > 12
AsyncTask uses the AsyncTask.SERIAL_EXECUTOR. AsyncTask.SERIAL_EXECUTOR has an unbounded queue. So in this scenario RejectedExecutionException is never thrown.
Solution 1 (AKA the "clean" solution)
Use a separate APK with targetSdkVersion > 12 and a higher versionCode so that is preferred for HONEYCOMB_MR2 and later versions of Android. This will cause AsyncTask to use ThreadPool.SERIAL_EXECUTOR on HONEYCOMB_MR2 and later version of Android.
Solution 2 (AKA the dirty hack)
Just make AsyncTask.SERIAL_EXECUTOR the default using Reflection.
AsyncTask.class.getMethod("setDefaultExecutor", Executor.class).invoke(null, AsyncTask.SERIAL_EXECUTOR);
Post a Comment for "Avoiding Rejectedexecutionexception In Android 4.4 When App Uses List"