Android Q - 在执行器上执行 AsyncTask 时出现 StackOverflowError

标签 android android-asynctask android-10.0

我的代码在过去 5 年里没有改变并且工作正常 - 我最近开始看到 StackOverflowErrorFabric/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)

enter image description here

知道如何处理这个问题吗?

最佳答案

最近的 Android 操作系统优化对后台操作/任务进行了限制,以最佳地利用设备资源(电池、CPU...)。因此,目前有效的功能可能会在 Q 上出现问题。

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

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

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

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

关于Android Q - 在执行器上执行 AsyncTask 时出现 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756106/

相关文章:

java - .setOnClickListener 上的空指针异常

android - RecyclerLayout 内部 CoordinatorLayout scrollToPosition 可见性

java - AsyncTask线程执行完还在,正常吗?

android - 在 ASyncTask 中设置 op ViewPager

android - 在 Android 应用程序中隐藏加密 key

android - 在 PreferenceScreen 的首选项中添加一个 TextView

android - 异步任务异常

android - 如何知道 Android Q 中的应用程序已暂停?

android - ExifInterface GPS 无法在 Android Q/10 上读取

java - Android 10 上的 InflationX/书法崩溃