超过线程池9和排队任务128时,Android应用程序崩溃

时间:2015-12-21 11:49:10

标签: android multithreading android-asynctask threadpool threadpoolexecutor

应用程序传导api每10秒调用一次来自网络提供商的gps位置。并且还有几个api调用可以由用户完成。

应用程序崩溃与法律互联网或更少的互联网连接(设备数据访问) 是否有一种正确的方法来防止应用程序崩溃并保持api请求,直到互联网网络可用。

这里我发布了我的崩溃重新存档堆栈跟踪

java.util.concurrent.RejectedExecutionException: 
Task android.os.AsyncTask$3@4206a5b0 rejected from java.util.concurrent.ThreadPoolExecutor@41e97858[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)

2 个答案:

答案 0 :(得分:3)

queued tasks = 128表示您已达到AsyncTask的最大任务数:

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

一个方法是将您的作业排列在一些数据结构中,例如bundle中,并将其存储在某个数据库(sqlite)中。无论如何,这将是有用的,因为如果用户将终止您的应用程序,那么现在您的所有任务都将丢失。如果它们保存在sqlite中 - 那么你可以在下一个应用程序运行时发送它们。

您也可以使用Executors.newSingleThreadExecutor,它具有无限制的队列,但您必须自己进行任何UI更新 - 例如使用处理程序。 AsyncTask的实现基于Executors。

答案 1 :(得分:2)

根据我对AsyncTask的理解,在kitkat只能排队128个任务之前的AsyncTask实现。在此之上它将发出RejectedExecutionException。所以我建议你减少创建的AsyncTask的数量