我在主 UI 线程(相关问题)中遇到 StackOverflowErrors 问题。我的应用面向 Android 2.3+。在 Android 4 上一切都很好,但是在绘制视图布局时我在 2.3.3 上崩溃了。
显而易见的答案是优化我的视图布局并减少嵌套视图的数量。这是一个问题,因为大量视图是由于我使用了标签的支持库和片段 - 这是推荐的方法。我不想仅仅因为旧版本的操作系统有一个小堆栈就改变我的设计并丢弃片段。
我正在寻找增加 UI 线程堆栈大小的方法。我已经看到了这是不可能的答案,并且我知道清单中没有简单的设置可以做到这一点。但是,我仍然不满意没有手动解决方法。
到目前为止我最好的主意:
创建一个具有更大堆栈的新工作线程(Thread 类)。可以增加工作线程的堆栈大小。然后,以某种方式将此线程转换为新的 UI 线程。如何?
浏览android.app.Activity .attach(..) 的Android 源代码,我看到一个活动将自己附加到一个UI 线程。也许有一些方法可以替换它附加的线程并将其更改为我的“新”UI线程
深入了解android.app.ActivityThread .startActivityNow(..),也许我可以手动启动我的活动。创建活动后,它会自动将自己附加到创建它的线程上。也许如果我从我的新 UI 线程运行它,它会起作用。
如果我创建一个新的 UI 线程,我将不得不为它手动创建 Looper。我了解需要从android.app.ActivityThread .main(..)创建什么
其他想法:
手动捕获 StackOverflowError 并在它发生时异步移动调用,以便它们具有更小的堆栈。我在这里看到了这个好主意,但我无法让它发挥作用。
NDK 线程(通过 JNI)有很大的堆栈。我考虑过使用它们来谋取利益,但我认为没有办法做到这一点。所有通过 JNI 的调用都是在它们自己的线程上执行的,所以我看不到如何使用 NDK 线程进行 UI 访问。
所以..
除了说这是一个非常糟糕的主意之外,还有其他建议或提示吗?你能找到做过类似事情的人吗?我不能..