我的代码在过去 5 年里没有改变并且工作正常 - 我最近开始看到 StackOverflowError
在 Fabric/Firebase Crashlytics 中 - 所有错误均来自 Android 10 设备。
我有一个自定义AsyncTask
并使用 task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, data);
激活它
data
是我的应用程序中的一个简单对象。
我没有发布我的自定义任务 b/c 我认为该错误是由 android 内部生成的。
此行导致此堆栈跟踪
Fatal Exception: java.lang.StackOverflowError: stack size 8192KB at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1386) at 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.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.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.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.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.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.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.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.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.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 android.os.AsyncTask.executeOnExecutor(AsyncTask.java:711)
知道如何处理这个问题吗?
最佳答案
最近的 Android 操作系统优化对后台操作/任务进行了限制,以最佳地利用设备资源(电池、CPU...)。因此,目前有效的功能可能会在 Q 上出现问题。
1)如果AsnycTask在应用程序已经在后台时被触发,它可能会受到操作系统的限制。
2) 如果 AsyncTask 在应用程序处于前台时触发,但处理时间过长,它可能会被操作系统限制/终止。
理想情况下,AsyncTasks 应该用于短操作(最多几秒钟)。Src 。
带有“rejectedExecution”的错误调用堆栈提示我第一种情况,即应用程序处于后台,因此任务被拒绝执行(而不是在其间取消)。 为了让任务在应用程序不在前台时可靠地运行,推荐的方法是使用 Service 类或其扩展版本,例如基于任务需求的IntentService。希望有帮助!
关于Android Q - 在执行器上执行 AsyncTask 时出现 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756106/