The Android application fails when overtaking the Thread 9 pool and the pending tasks 128

advertisements

The application conduction api calls in every 10seconds with the gps location from the network provider. And also there are several api calls can be do by the user.

application is crashing with law internet or less internet connection(device data access) is there a proper way to prevent app crashing and hold the api request till the internet network available.

here im posting my crash reprort stacktrace

java.util.concurrent.RejectedExecutionException:
Task [email protected] rejected from [email protected][Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 2]
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 com.pickme.driver.service.LocationUpdate$LocationUpdateTask$1.run(LocationUpdate.java:216)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5333)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:711)
at dalvik.system.NativeStart.main(Native Method)


queued tasks = 128 indicates that you have reached maximum count of tasks for AsyncTask:

private static final BlockingQueue sPoolWorkQueue = new LinkedBlockingQueue(128);

one aproach is to queue your jobs in some data structure, in example bundles and store it in some database (sqlite). It would be usefull anyway because if user will terminate your application, then now all your tasks are lost. If they are persisted in sqlite - then you can send them on next app run.

You could also use Executors.newSingleThreadExecutor, which has unbounded queue, but you would have to do any UI updates yourself - in example with handlers. AsyncTask-s implementation is based on Executors.