tal*_*kol 8 android android-sdk-2.3
我在主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访问.
所以..
除了说这是一个非常糟糕的想法,还有其他任何建议或提示吗?你能找到做类似事情的人吗?我不能......
可悲的是,CommonsWare 犯了一个错误。仔细检查发现,Android 2.x 上的默认堆栈大小为 12KB,而在 Android 4.x 中已增加到 16KB。这意味着核心团队意识到了小堆栈问题并修复了它。遗憾的是,正是这些额外的 4KB 导致了崩溃。
此外,如果您使用 ABS 等通用库并支持 v4 - 每当您使用片段时,这些库都会向您的布局添加额外的视图。由于我们大多数人都依赖这些库,因此说可以使用 1 个视图轻松添加片段是完全错误的。如果您使用 ABS+support lib,您将为每个片段支付 3 次观看费用。您将从至少 5 个视图开始(对于 ABS 布局)。
关于手动创建 UI 线程,这可能是可能的,并且可能不需要 root 设备或更改其固件。这些也是可能不正确的大胆言论。
最后,我决定不创建自己的具有大堆栈的 UI 线程。相反,我选择从代码中完全放弃使用片段。这在我的布局中总共节省了 5 个视图。片段为您提供的所有内容也可以通过手动添加 ViewGroup 来完成。只是多了一点代码,但并没有太复杂。似乎碎片有点无用,如果你没有奢侈地使用它们 - 这是第一个要切割的地方。
| 归档时间: |
|
| 查看次数: |
1498 次 |
| 最近记录: |