在我目前正在开发的应用程序中,存在一个持续存在的错误,该错误会在看似随机的时间部分“冻结”用户界面:
UI 在前台时突然冻结,但所有 ui 组件(按钮、选项卡等)仍然可单击。当我点击组件时,点击动画会被触发,但其后面的 onClickListener 不会被触发。然后,该组件将在视觉上保持“单击”状态,并且不会返回到可以再次单击的状态。出现问题时,ScrollViews 中的滚动仍然有效。 因此,用户界面似乎没有完全冻结,但它基本上没有响应,这迫使用户再次终止并重新打开应用程序。 一旦应用程序重新启动,一切都会恢复正常。
此错误出现的频率似乎因设备而异。在三星 Galaxy S10 5G(Android 12)上这种情况很少发生(可能每隔几天一次),但在 OnePlus 8T(也是 Android 12)上每小时会发生多次。
当前的目标 Android SDK 是 Android 12L (SDK 32),但该问题在 Android 11 (SDK 30) 上仍然存在
应用程序不会崩溃,因此没有崩溃报告。该应用程序基本上会一直运行,直到用户终止该应用程序。 然而,有一个实例,我遇到了以下 ANR:(很难说 ANR 是由这个问题直接引起的,还是这个 bug 发生后各种事情失败的结果。)
E/ActivityManager: ANR in com.myApp.debug (com.myApp.debug/com.myApp.View.MainScreen)
PID: 11357
Reason: Input dispatching timed out (Application does not have a focused window)
Parent: com.myApp.debug/com.myApp.View.MainScreen
Frozen: false
Load: 8.0 / 8.88 / 9.36
----- Output from /proc/pressure/memory -----
some avg10=0.08 avg60=0.02 avg300=0.18 total=25943745
full avg10=0.00 avg60=0.00 avg300=0.00 total=4032128
----- End output from /proc/pressure/memory -----
我花了很多时间试图找出这个问题的根源,但找不到任何可能导致这个问题的实质性内容。然而,通过阅读互联网上无数的帖子,我发现了导致此问题的一些可能原因:
可能的内存泄漏??: 我在 Android Studio 分析器中监控了应用程序的 RAM 和 CPU 使用情况...虽然有时应用程序使用相当多的 RAM,但当应用程序根本不使用大量 RAM 时,似乎也会出现此问题。 CPU使用率通常也在5%左右
太多碎片??: 在运行时,多个片段会附加到单个主要活动。这些片段要么是页面中的元素,要么用作覆盖在主要活动之上的完整页面。如果执行某个设置向导,主 Activity 顶部可能会显示超过 10 个片段。
主线程负载过多?: 该应用程序确实每隔几秒就会通过蓝牙、Wifi 或云向设备发送频繁的请求,然后通过这些请求更新视图,但似乎不会出现主线程或后端线程上出现极端负载的情况。导致 UI 冻结。视图通常通过从合并通道接收数据来更新,然后通过 comsumeEach 方法在视图内进行处理。
任何类似问题的经验或任何帮助将不胜感激!
我最近一直在努力解决似乎相同的问题。你发现它的原因了吗?