首页 > 解决方案 > Android Q - 在执行程序上执行 AsyncTask 时出现 StackOverflowError

问题描述

我的代码在过去 5 年没有改变并且运行良好——我最近开始StackOverflowErrorFabric/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)

在此处输入图像描述

知道如何处理吗?

标签: androidandroid-asynctaskandroid-10.0

解决方案


最近的 Android 操作系统优化对后台操作/任务进行了限制,以优化使用设备资源(电池、CPU...)。因此,迄今为止有效的功能可能会在 Q 上出现异常。

1)如果在应用程序已经在后台时触发了AsnycTask,它可能会被操作系统限制。

2) 如果 AsyncTask 在应用程序处于前台时触发但处理时间过长,它可能会被操作系统限制/杀死。

理想情况下,AsyncTasks 应该用于短操作(最多几秒钟)。Src

带有“rejectedExecution”的错误调用堆栈提示我第一种情况,即应用程序在后台,因此任务被拒绝执行(而不是在两者之间取消)。为了让应用程序不在前台时可靠地运行任务,推荐的方法是使用服务类或其扩展版本,例如基于任务要求的 IntentService。希望能帮助到你 !


推荐阅读