android 应用程序在超过线程池 9 和排队任务 128 时崩溃
android app crashes when exceeded Thread pool 9 and queued tasks 128
应用程序传导 api 每 10 秒调用一次来自网络提供商的 GPS 位置。用户还可以进行多个 api 调用。
应用程序因法律互联网或更少的互联网连接而崩溃(设备数据访问)
是否有适当的方法来防止应用程序崩溃并保持 api 请求直到互联网网络可用。
我在这里发布我的崩溃报告堆栈跟踪
java.util.concurrent.RejectedExecutionException:
Task android.os.AsyncTask@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.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
表示您已达到 AsyncTask 的最大任务数:
private static final BlockingQueue sPoolWorkQueue =
新的 LinkedBlockingQueue(128);
一种方法是在某些数据结构中对您的作业进行排队,例如捆绑并将其存储在某些数据库 (sqlite) 中。无论如何它都会有用,因为如果用户将终止您的应用程序,那么现在您的所有任务都将丢失。如果它们保存在 sqlite 中 - 那么您可以在下一个应用程序中发送它们 运行.
您也可以使用 Executors.newSingleThreadExecutor,它具有无限队列,但您必须自己执行任何 UI 更新 - 例如使用处理程序。 AsyncTask-s的实现是基于Executors的。
据我对AsyncTask的了解,kitkat之前的AsyncTask实现只能排队128个任务。超过它会发出RejectedExecutionException
。所以我建议您减少创建的 AsyncTask 的数量。
应用程序传导 api 每 10 秒调用一次来自网络提供商的 GPS 位置。用户还可以进行多个 api 调用。
应用程序因法律互联网或更少的互联网连接而崩溃(设备数据访问) 是否有适当的方法来防止应用程序崩溃并保持 api 请求直到互联网网络可用。
我在这里发布我的崩溃报告堆栈跟踪
java.util.concurrent.RejectedExecutionException:
Task android.os.AsyncTask@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.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
表示您已达到 AsyncTask 的最大任务数:
private static final BlockingQueue sPoolWorkQueue = 新的 LinkedBlockingQueue(128);
一种方法是在某些数据结构中对您的作业进行排队,例如捆绑并将其存储在某些数据库 (sqlite) 中。无论如何它都会有用,因为如果用户将终止您的应用程序,那么现在您的所有任务都将丢失。如果它们保存在 sqlite 中 - 那么您可以在下一个应用程序中发送它们 运行.
您也可以使用 Executors.newSingleThreadExecutor,它具有无限队列,但您必须自己执行任何 UI 更新 - 例如使用处理程序。 AsyncTask-s的实现是基于Executors的。
据我对AsyncTask的了解,kitkat之前的AsyncTask实现只能排队128个任务。超过它会发出RejectedExecutionException
。所以我建议您减少创建的 AsyncTask 的数量。