【问题标题】:android app crashes when exceeded Thread pool 9 and queued tasks 128超过线程池 9 和排队任务 128 时,android 应用程序崩溃
【发布时间】:2016-03-27 11:42:08
【问题描述】:

应用程序每 10 秒使用来自网络提供商的 gps 位置进行一次 api 调用。并且用户可以执行几个 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)

【问题讨论】:

  • 您是使用 kitkat 还是更低的设备来测试应用程序?试用 android 5.0(lollipop)..
  • 使用 kitkat 及更低的设备
  • 对我来说,崩溃是由这行引起的:new pingHTTP(connURL.get(i),i).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);。这是我的FATAL EXCEPTIONjava.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@bab00da rejected from java.util.concurrent.ThreadPoolExecutor@4adf90b[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 1061] at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2078) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:843)
  • @JaimeMontoya asyncloader 现在可用。请使用异步加载器自行处理线程池。

标签: android multithreading android-asynctask threadpool threadpoolexecutor


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的即时答复。我是否有可能继续从 GPS 收集我的位置点并在网络可用时存储在共享首选项中。并不断检查网络是否可用。当网络可用时创建一个 json 对象并调用 api。请告诉我我的方法的利弊。
【解决方案2】:

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

【讨论】:

  • 感谢您的即时答复。我是否有可能继续从 GPS 收集我的位置点并在网络可用时存储在共享首选项中。并不断检查网络是否可用。当网络可用时创建一个 json 对象并调用 api。请告诉我我的方法的利弊。请给我一个正确的方法来避免“RejectedExecutionException”
猜你喜欢
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2011-01-16
  • 2011-11-18
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多