在Android中手动创建UI线程以增加其小堆栈大小

2024-04-05

我在主 UI 线程中遇到 StackOverflowErrors 问题(相关问题 https://stackoverflow.com/questions/16843357/what-is-the-android-ui-thread-stack-size-limit-and-how-to-overcome-it)。我的应用程序面向 Android 2.3+。在 Android 4 上一切正常,但在 2.3.3 上绘制视图布局时出现崩溃。

显而易见的答案是优化我的视图布局并减少嵌套视图的数量。这是一个问题,因为大量的视图是由于我使用选项卡的支持库和片段 - 这是推荐的方法。我不想仅仅因为旧版本的操作系统有一个小堆栈就改变我的设计并删除片段。

我正在寻找增加 UI 线程堆栈大小的方法。我见过answers https://stackoverflow.com/a/8865363/1025458这是不可能的,而且我知道清单中没有简单的设置可以做到这一点。但是,我仍然不满意没有手动解决方法。

到目前为止我最好的想法:

创建一个具有更大堆栈的新工作线程(Thread 类)。可以增加工作线程的堆栈大小。然后,以某种方式将该线程转换为新的 UI 线程。如何?

  • 浏览 Android 源代码android.app.Activity http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/app/Activity.java?av=f.attach(..) 我已经看到一个 Activity 将自身附加到 UI 线程。也许有某种方法可以替换它所附加的线程并将其更改为我的“新”UI 线程

  • 更深入一点android.app.ActivityThread http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/app/ActivityThread.java?av=f.startActivityNow(..),也许我可以手动启动我的活动。创建活动后,它会自动将自身附加到创建它的线程。也许如果我从新的 UI 线程运行它,它就会起作用。

  • 如果我创建一个新的 UI 线程,我将必须为其手动创建 Looper。我开始了解需要创建什么android.app.ActivityThread http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/app/ActivityThread.java?av=f。主要的(..)

其他想法:

  • 手动捕获 StackOverflowError,并在发生时异步移动调用,以便它们具有较小的堆栈。我见过这个好主意here https://stackoverflow.com/questions/6705425/fixing-the-stackoverflow-error/14885190#14885190但我无法让它发挥作用。

  • NDK 线程(通过 JNI)具有大型堆栈。我考虑过使用它们来为我谋取利益,但我看不出有什么办法可以做到这一点。通过 JNI 的所有调用都在其自己的线程上执行,因此我看不到如何使用 NDK 线程进行 UI 访问。

So..

除了说这是一个非常糟糕的主意之外,还有其他建议或提示吗?你能找到做过类似事情的人吗?我不能..


可悲的是,CommonsWare 犯了一个错误。仔细检查发现,Android 2.x 上的默认堆栈大小为 12KB,而在 Android 4.x 中已增加到 16KB。这意味着核心团队意识到了小堆栈问题并修复了它。遗憾的是,正是这些额外的 4KB 导致了崩溃。

此外,如果您使用 ABS 等通用库并支持 v4 - 每当您使用片段时,这些库都会向您的布局添加额外的视图。由于我们大多数人都依赖这些库,因此说可以使用 1 个视图轻松添加片段是完全错误的。如果您使用 ABS+support lib,您将为每个片段支付 3 次观看费用。您将从至少 5 个视图开始(对于 ABS 布局)。

关于手动创建 UI 线程,这可能是可能的,并且可能不需要 root 设备或更改其固件。这些也是可能不正确的大胆言论。

最后,我决定不创建自己的具有大堆栈的 UI 线程。相反,我选择从代码中完全放弃使用片段。这在我的布局中总共节省了 5 个视图。片段为您提供的所有内容也可以通过手动添加 ViewGroup 来完成。只是多了一点代码,但并没有太复杂。似乎碎片有点无用,如果你没有奢侈地使用它们 - 那就是第一个被削减的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Android中手动创建UI线程以增加其小堆栈大小 的相关文章

随机推荐

  • Vim 折叠:如何隐藏所有不包含搜索模式的单行(或折叠零行)?

    我有一些文本文件 它们只是没有段落的列表 当我想专注于某个项目时 我可以折叠除搜索匹配项之外的所有内容 这要归功于 Vim Wikia 提示 282 简单折叠 set foldexpr getline v lnum nnoremap
  • Web 声卡检测

    我们需要一些关于业余爱好网络项目的提示 在此阶段 我们要检测客户端的声卡并将来自声卡的任何内容引导到服务器以处理音频 低延迟对我们来说是一个重要问题 因此 我们需要您对使用的语言 库等的建议 如果你能给我们一些大局的信息 那么我们就可以自己
  • git 报告合并冲突,没有任何更改,空行(使用 git-subtree)

    我正在测试使用git 子树 https github com apenwarr git subtree将库存储库合并到更大的项目中 原则上看起来很棒 有时 当我执行 git subtree pull 时 我会遇到如下合并冲突 lt lt l
  • Windows 7 .net Excel .SaveAs() HRESULT 错误异常:0x800A03EC

    背景 我在工作中为我的旧硬盘干杯 现在正在买一个新硬盘 这样我就必须重建我的机器 我的经理在他借用的笔记本电脑上安装了 Windows 7 在我的机器无法使用时我一直在使用这台笔记本电脑 但我遇到了一个问题 我们有相当多的应用程序使用 Mi
  • 我可以使用 git 提交文件,但在执行 git svn dcommit 时自动忽略它吗?

    我现在开始在 SVN 办公室采用 Git 作为我的个人工作流程 因此 git svn 是我将严重依赖的工具 我遇到的一个我不知道如何解决的问题是如何在一个方向上忽略 对我来说 具体的用例是我们的 ant 构建文件引用 svn 和 svnve
  • 具有相同列和索引的多个数据帧的平均值

    我有一些数据框 它们每个都有相同的列和相同的索引 对于每个索引 我想对每列中的值进行平均 如果这些是矩阵 我只需将它们相加并除以矩阵数量 这是一个例子 v1 pd DataFrame ind1 1 2 3 ind2 4 5 6 column
  • 适用于 Mac 的 C IDE 好用吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚开始在 Mac 上用 C 进行编程的工作 这是我第一次使用 Mac 进行开发 现在我使用 Xcode 作为编辑器 然后在命令行中使用
  • React-native 和 React

    我正在构建一个网络应用程序和 ios android 相同的应用程序 起初我认为 Cordova 可能是一个不错的选择 但读完之后我认为 React native 可能是一个更好的选择 我的问题是 我是否必须编写同一个应用程序两次 一次在
  • #include 导致错误

    VS 2010 C CLR 库项目 添加 comutil h 库时出错 gt Error 20 error LNK2001 unresolved gt external symbol extern C long gt stdcall Var
  • PostgreSQL - 动态值作为表名[重复]

    这个问题在这里已经有答案了 可能的重复 Postgres动态查询功能 https stackoverflow com questions 10639963 postgres dynamic query function 我希望使用下面的查询
  • 如何确定 Pandas 列是否包含特定值

    我试图确定 Pandas 列中是否有具有特定值的条目 我尝试这样做if x in df id 我认为这是有效的 除非我给它提供了一个我知道不在列中的值43 in df id 它仍然返回True 当我子集为仅包含与缺少的 id 匹配的条目的数
  • 服务器删除自定义 HTTP 标头字段

    我一直在尝试接收标头中带有自定义字段的 HTTP 请求 但似乎我的服务器删除了它们 这是我发送到服务器的请求 我使用 HTTP 代理读取该请求 POST oauth php request token HTTP 1 1 Host domai
  • Xbox 上的 UWP 应用

    在围绕 Windows 10 的活动和促销期间 我总是看到 UWP 应用程序可以在 Microsoft 系列的所有设备上运行 为了确认这一点 当我在浏览器上浏览 UWP 应用程序并单击以查看应用程序页面的源代码时 我能够看到以下元数据 那
  • MPAndroidChart:带有三次贝塞尔曲线的折线图显示错误(尖峰和循环)

    我正在尝试制作带有立方图的折线图 结果如下面的屏幕截图所示 三次贝塞尔曲线显示错误并且有 尖峰 有人可以帮我让它正确显示吗 这是我的配置 LineDataSet lineDataSet new LineDataSet entries nam
  • 如何更新 xml 文件而不将整个文件加载到内存中

    我们如何更新 xml 文件而不将其完全加载到内存中 在下面的代码中 我想浏览每个父节点注释并更新 to 节点的值 我们如何使用 C 来实现这一点 我必须根据代码中的其他一些计算来更新 to 字段
  • 以编程方式连接两个子系统

    我正在尝试以编程方式重用我之前开发的一些自定义块 模型来构建一个复杂的模型 但我无法设法连接两个 PMC Port 这就是我所拥有的 Main system sys name model sys new system sys name op
  • 是否可以使用连续传递样式将此递归函数转换为尾递归函数?

    我最近写了一个ETL 效果很好 我想提醒自己如何使用免费的 monad 因此想将我的 ETL 转换为这样的 注意 我的目的不是写一个更好的 ETL 而是让自己重新熟悉免费的 monad 在重新学习自由单子如何工作时 我偏离了这个问题的主题
  • 我在片段内有一个复选框,我希望它在单击注册按钮时发布一些数据,该按钮位于我的主要活动内?

    我第一次在片段中工作 在主要活动中 我有一个 spinnerListner 随着微调器中的项目发生变化 在片段容器中 片段相应地发生变化 我刚刚在fragment xml 文件中创建了一些复选框 我只想在每次注册点击时为每个选中的复选框发布
  • 在文本字段中输入文本时禁用面板水平滚动

    当有人在文本字段中输入文本时 我想禁用面板的水平滚动 第一个问题 目前的问题是 当您在任何文本字段中输入文本并按键盘上的右箭头键 keyCode 39 时 面板水平方向也会向正确的方向移动 我想在文本字段中输入文本时禁用它 第二个问题仅当单
  • 在Android中手动创建UI线程以增加其小堆栈大小

    我在主 UI 线程中遇到 StackOverflowErrors 问题 相关问题 https stackoverflow com questions 16843357 what is the android ui thread stack