UI 线程卡在 2.3 设备上

Posted

技术标签:

【中文标题】UI 线程卡在 2.3 设备上【英文标题】:UI thread is getting stuck on 2.3 devices 【发布时间】:2015-02-06 13:38:16 【问题描述】:

我正在开发一个非常大的应用程序。有时当我在 2.3 设备上启动它时,UI 线程会莫名其妙地卡住。我不认为这是我自己的任务之一,但我无法弄清楚它是什么。有什么方法可以让我弄清楚 UI 线程中当前正在运行的确切任务是什么?

更多信息: 我在Handler 上运行Runnable,在某些时候使用主要的Looper,但run() 在这些情况下永远不会被执行。当我触摸屏幕时,我也会收到 ANR。我认为它必须以某种方式与内存相关,因为当我删除其中一个背景图像时,感觉它卡住的更少。不过,我没有收到 OOM 异常。

编辑

我为主要Looper 启用了日志记录。最后一个被分派的任务是what=1004。这绝对不是我写的。

Looper: >>>>> Dispatching to Handler406cbec0 null: 1004

【问题讨论】:

您是从辅助线程更新 UI 吗? 我不知道。我启用了严格模式,我想这会通知我。 嗯,在我看来,你要么在主线程上做一些繁重的工作,要么在一些网络/数据库调用上做一些事情,或者你正在从辅助线程更新 UI,但在大多数情况下应用程序会崩溃。如果您需要更多帮助,请在此处发布您的活动代码 :) 如果这只发生在一个屏幕上,请发布活动/片段代码。这将有助于回答您的问题。 正如我所说,该应用程序非常大,我不知道要发布代码的哪些部分。虽然 UI 线程没有繁重的工作。我怀疑一些内部的 android UI 构建方法左右。 【参考方案1】:

很抱歉作为答案发布(没有足够的评论点数),但我相信命名您的 AsyncTasks 和线程,然后使用 DDMS 或任何其他 Android 分析工具可能有助于解决您的问题。

通过找出最耗性能/最耗时的方法和线程,或者可能导致内存过载的东西(使用 DDMS 检查堆)。

看看以下链接:

http://developer.android.com/tools/debugging/ddms.html http://developer.android.com/tools/debugging/debugging-tracing.html

很抱歉,如果这没有任何帮助。

【讨论】:

问题是我已经超过了 dex 方法计数,并且如果不先用 proguard 剥离它,就无法在较旧的 Android 版本上运行该应用程序。所以内存转储或方法分析几乎是没有选择的。

以上是关于UI 线程卡在 2.3 设备上的主要内容,如果未能解决你的问题,请参考以下文章

“无法访问主线程上的数据库,因为它可能会长时间锁定 UI。”我的协程错误

Linux历史上线程的3种实现模型

Android的Handler基本原理源码分析

Android的Handler基本原理源码分析

Android的Handler基本原理源码分析

Android的Handler基本原理源码分析