在Android中手动创buildUI线程以增加其较小的堆栈大小

我在主UI线程( 相关的问题 )StackOverflowErrors挣扎。 我的应用程序的目标是Android 2.3+。 在Android 4上一切都很好,但是在2.3.3的视图布局绘制时出现崩溃。

显而易见的答案是优化我的视图布局,并减less嵌套视图的数量。 这是一个问题,因为大量的意见是由于我使用支持库和片段的标签 – 这是推荐的方法。 我不想改变我的devise,并放弃片段,因为OS的旧版本有一个小的堆栈。

我正在寻找方法来增加UI线程的堆栈大小。 我已经看到了这是不可能的答案 ,我明白清单中没有简单的设置。 但是,我仍然不满意,没有手动解决方法。

我迄今为止最好的想法是:

用更大的堆栈创build一个新的工作线程(Thread类)。 可以增加工作线程的堆栈大小。 然后,将这个线程转换到新的UI线程。 怎么样?

  • 浏览android.app.Activity .attach(..)的Android源码我已经看到一个活动将自己附加到一个UI线程。 也许有一些方法来replace它所连接的线程,并将其更改为我的“新”UI线程

  • 进一步深入android.app.ActivityThread .startActivityNow(..),也许我将能够手动开始我的活动。 一旦活动被创build,它就自动附加到它创build的线程上。 也许如果我从我的新的UI线程运行这个,它将工作。

  • 如果我创build一个新的UI线程,我将不得不手动创build它的Looper。 我得到了什么是需要从android.app.ActivityThread .main(..)创build的感觉

其他想法:

  • 手动捕获StackOverflowError,并在发生asynchronous移动调用,以便他们有一个较小的堆栈。 我在这里看到了这个不错的主意,但是我无法做到这一点。

  • NDK线程(通过JNI)有很大的堆栈。 我想过为了我的利益而使用它们,但是我认为没有办法做到这一点。 所有通过JNI的调用都在自己的线程上执行,所以我看不到如何使用NDK线程进行UI访问。

所以..

除了说这是一个非常糟糕的主意,其他任何build议或提示? 你能find任何类似的人吗? 我不能..

Solutions Collecting From Web of "在Android中手动创buildUI线程以增加其较小的堆栈大小"

CommonsWare是可悲的错误。 更仔细的检查表明,Android 2.x上的默认堆栈大小是12KB,而Android 4.x中的默认堆栈大小已增加到16KB。 这意味着核心团队意识到小堆栈问题并对其进行修复。 可悲的是,这些额外的4KB是什么使崩溃中的所有差异。

此外,如果您使用的是像ABS这样的通用库并支持v4,则只要您使用碎片,这些库就会将额外的视图添加到布局中。 由于我们大多数人都依赖这些库,所以说可以很容易地添加1个视图的片段是不正确的。 如果您正在使用ABS +支持库,您将为每个片段支付3次视图。 你将从最less5个视图开始(ABS布局)。

关于手动创buildUI线程,这可能是可能的,可能不需要根设备或更改其固件。 这些也是大胆的说法,可能是不正确的。

最后,我决定不要用大堆创build自己的UI线程。 相反,我select完全放弃使用我的代码片段。 这在我的布局中共为我节省了5个视图。 碎片给你的所有东西,也可以通过手动添加ViewGroups来完成。 这只是一个更多的代码,但没有太复杂。 看起来碎片有点无用,如果你没有使用它们的奢侈 – 那是第一个切割的地方。

在Android 4上一切都很好

不,你只是还没有坠毁。 我不知道他们增加了Android 4.x的堆栈大小。 他们可能会让一些小部件更有效率,这可以让你在一些操作中生存一段时间。

这是一个问题,因为大量的意见是由于我使用支持库和片段的标签 – 这是推荐的方法

欢迎您在制表符中使用普通Views ,无论这些制表符来自ViewPager (以及适当的指示器),操作栏,还是古代的TabHost 。 片段不是必需的。

我正在寻找方法来增加UI线程的堆栈大小

这是不可能的,除了修改Android框架,迫使8亿Android设备用户在他们的手机根植他们的手机,并取代他们的框架。 即使有可能,除非你有能力在数百台设备上进行testing,但是你不知道你的黑客是否稳定。

无论如何,15岁还是太过分了,特别是当没有人能确切地知道边缘在哪里的时候

如果我正确记住了数字,那么“边缘”是8KB的堆栈空间。 有才华的程序员意识到,不能根据层次结构中嵌套视图的数量精确地expression“边缘”,因为堆栈消耗将根据正在执行的操作和操作系统级别而变化。

我看到很多人都陷入了同样的问题

你对“这么多”的价值相当低。 根据在公共支持领域提出的问题,这一年来一直不是一个重大问题。

支持库中的选项卡片段活动本身占用5个视图。

由于Android中没有任何东西被命名为“标签片段活动”,所以我们无法帮助您,除了build议使用其他标签来源。 例如,具有TabPagerIndicator (来自ViewPagerIndicator )的ViewPager应该沿着关键path位于两个嵌套级别附近。

那么每个片段至less有4个。

有才华的程序员意识到片段甚至不需要视图,所以片段的最小视图数量是0.有才华的程序员也意识到,具有UI的片段最less需要1个视图,而不是4个,因为你可以从onCreateView()返回任何你想要的ViewonCreateView()的语义中没有什么需要4。

例如, 这个示例项目使用带有ViewPagerTabPagerIndicator和标签的片段。 从根到关键path叶,整个结构有7个层次。

在我个人的层级中有10个观点是没有什么特别的

是的,一旦你添加了所有活动内在的3个层次,13个层次肯定会让我感到紧张。 在我引用的例子中, ViewPager ,它的选项卡和片段在其上增加了4个层次。 如果你说你想在一个标签中有10个层次的层次,我怀疑是否有一个标签解决scheme足够纤细,尽pipe行动条标签是一种可能性。

因此,您的解决scheme是:

  • 简化您的10级每标签层次结构
  • 如果这一点不足,请select一个更简单的选项卡实现