android - Android Q - 在执行程序上执行 AsyncTask 时出现 StackOverflowError
问题描述
我的代码在过去 5 年没有改变并且运行良好——我最近开始StackOverflowError
在Fabric/Firebase Crashlytics中看到——所有错误都来自 Android 10 设备。
我有一个自定义AsyncTask
,它是使用task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, data);
data
我的应用程序中的一个简单对象激活的。
我没有发布我的自定义任务 b/c 我认为错误是由 android 内部生成的。
此行导致此堆栈跟踪
致命异常:java.lang.StackOverflowError:java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1386) 处 java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 处的堆栈大小 8192KB .util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133 ) 在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution (ThreadPoolExecutor.java:2133) 在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util.concurrent.ThreadPoolExecutor$ DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util.concurrent .ThreadPoolExecutor$DiscardOldestPolicy。在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util.concurrent.ThreadPoolExecutor 的拒绝执行(ThreadPoolExecutor.java:2133) $DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util。 concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) at java .util.并发。ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 java.util .concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在android.os.AsyncTask.executeOnExecutor(AsyncTask.java:711)在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent 的 java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 执行(ThreadPoolExecutor.java:1394) .ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:711)在 java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:848) 在 java.util.concurrent 的 java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy.rejectedExecution(ThreadPoolExecutor.java:2133) 执行(ThreadPoolExecutor.java:1394) .ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1394) 在 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:711)
知道如何处理吗?
解决方案
最近的 Android 操作系统优化对后台操作/任务进行了限制,以优化使用设备资源(电池、CPU...)。因此,迄今为止有效的功能可能会在 Q 上出现异常。
1)如果在应用程序已经在后台时触发了AsnycTask,它可能会被操作系统限制。
2) 如果 AsyncTask 在应用程序处于前台时触发但处理时间过长,它可能会被操作系统限制/杀死。
理想情况下,AsyncTasks 应该用于短操作(最多几秒钟)。Src。
带有“rejectedExecution”的错误调用堆栈提示我第一种情况,即应用程序在后台,因此任务被拒绝执行(而不是在两者之间取消)。为了让应用程序不在前台时可靠地运行任务,推荐的方法是使用服务类或其扩展版本,例如基于任务要求的 IntentService。希望能帮助到你 !
推荐阅读
- python - 如何递归地找到范围内偶数的总和?
- reactjs - 内联转换持续时间奇怪的行为
- sap-cloud-sdk - 一码支持多版本Odata服务
- python - 熊猫多处理代码中的错误 - 数据帧不可调用
- flutter - 如何在 Flutter 中构建依赖下拉菜单?
- html - 表 rowspan > 1 是否正确停止其子 div 高度设置为父级的 100%?
- php - (Laravel Eloquent) 获取类别和所有嵌套子类别的帖子
- reactjs - 如何处理具有密集逻辑的 React 组件?
- keyboard - 如何使用 Testcafe .keypress() 触发组合键“CTRL+SHIFT+ENTER”?
- excel - 创建“插头”时避免循环引用