一次性加载100条数据到RecyclerView触发ANR致应用崩溃求助
一次性加载100条数据到RecyclerView引发ANR崩溃的解决方案
日志分析
从提供的ANR日志可以明确:
- 触发核心原因:
MainThread worked timeout,主线程执行耗时操作超时,无法及时响应用户或系统事件 - 应用进程
in.games.balajimarket(PID:9948)CPU占用高达102%,其中用户态占95%,说明主线程在执行大量同步耗时任务,直接导致ANR
ANR in in.app.balaji PID: 9948 Reason: App requested: MainThread worked timeout ErrorId: 8e317451-e531-43d9-b310-42b887bfd4c2 Frozen: false Load: 0.0 / 0.0 / 0.0 ----- Output from /proc/pressure/memory ----- some avg10=3.88 avg60=1.98 avg300=1.26 total=3095676089 full avg10=1.37 avg60=0.64 avg300=0.38 total=996839902 ----- End output from /proc/pressure/memory ----- ----- Output from /proc/pressure/cpu ----- some avg10=12.41 avg60=6.46 avg300=4.55 total=20593166863 ----- End output from /proc/pressure/cpu ----- ----- Output from /proc/pressure/io ----- some avg10=3.20 avg60=1.35 avg300=0.78 total=3793799535 full avg10=1.29 avg60=0.43 avg300=0.24 total=1815292022 ----- End output from /proc/pressure/io ----- CPU usage from 175018ms to -1ms ago (2024-01-25 15:46:00.073 to 2024-01-25 15:48:55.093): 16% 1969/system_server: 8.7% user + 7.5% kernel / faults: 69086 minor 114 major 13% 1562/surfaceflinger: 9% user + 4.7% kernel / faults: 3715 minor 65 major 5.5% 879/adbd: 1% user + 4.4% kernel / faults: 10979 minor 2 major 4.4% 6113/com.google.android.providers.media.module: 1.7% user + 2.7% kernel / faults: 8613 minor 126 major 4% 4221/com.android.systemui: 2.7% user + 1.3% kernel / faults: 35944 minor 210 major 3.6% 1405/vendor.qti.hardware.display.composer-service: 1.8% user + 1.7% kernel / faults: 325 minor 3.5% 9952/hybridswapd:0: 0% user + 3.5% kernel 3.5% 183/kswapd0:0: 0% user + 3.5% kernel 2.6% 649/logd: 0.4% user + 2.1% kernel / faults: 3407 minor 34 major 2.6% 9513/kworker/u24:0-devfreq_wq: 0% user + 2.6% kernel / faults: 180 minor 21% TOTAL: 9.5% user + 9.8% kernel + 0.2% iowait + 1.7% irq + 0.4% softirq CPU usage from 189ms to 1606ms later (2024-01-25 15:48:55.280 to 2024-01-25 15:48:56.698) with 99% awake: 169% 1969/system_server: 67% user + 101% kernel / faults: 7529 minor 341 major 71% 12305/AnrAuxiliaryTas: 21% user + 50% kernel 56% 2064/Signal Catcher: 34% user + 22% kernel 7% 7096/binder:1969_1F: 2.6% user + 4.4% kernel 5.3% 2067/HeapTaskDaemon: 4.4% user + 0.8% kernel 4.4% 7101/binder:1969_20: 2.6% user + 1.7% kernel 1.7% 7094/binder:1969_1D: 0.8% user + 0.8% kernel 1.7% 12303/AnrConsumer: 0% user + 1.7% kernel 0.8% 2074/binder:1969_2: 0.8% user + 0% kernel 0.8% 2842/Thread-5: 0% user + 0.8% kernel 0.8% 3211/binder:1969_4: 0% user + 0.8% kernel 0.8% 3408/android.imms: 0% user + 0.8% kernel 0.8% 3989/LockSettingsSer: 0.8% user + 0% kernel 0.8% 3993/tworkPolicy.uid: 0.8% user + 0% kernel 0.8% 3994/WifiHandlerThre: 0% user + 0.8% kernel 0.8% 4009/ranker: 0.8% user + 0% kernel 0.8% 4011/NotificationSer: 0% user + 0.8% kernel 0.8% 4052/SliceManagerSer: 0% user + 0.8% kernel 0.8% 4058/ackgroundThread: 0.8% user + 0% kernel 0.8% 4084/init_criticallo: 0% user + 0.8% kernel 0.8% 4089/OplusWifiCPUThr: 0.8% user + 0% kernel 0.8% 4114/OplusNetworkSta: 0.8% user + 0% kernel 0.8% 4205/athena_killer: 0% user + 0.8% kernel 0.8% 4224/oSenseResHandle: 0% user + 0.8% kernel 0.8% 4274/memFeatureT: 0.8% user + 0% kernel 0.8% 4621/HansStateMachin: 0.8% user + 0.8% kernel 0.8% 4636/CpuLimitManager: 0% user + 0.8% kernel 0.8% 6546/OwmIcmpMonitor: 0% user + 0.8% kernel 77% 183/kswapd0:0: 0% user + 77% kernel 113% 6113/com.google.android.providers.media.module: 38% user + 75% kernel / faults: 449 minor 31 major 13% 13445/Thread-8: 6.8% user + 6.8% kernel 12% 18569/Thread-13: 5.4% user + 6.8% kernel 10% 6667/Thread-3: 2.7% user + 8.2% kernel 10% 7042/Thread-12: 5.4% user + 5.4% kernel 10% 20490/Thread-19: 2.7% user + 8.2% kernel 10% 32141/Thread-9: 2.7% user + 8.2% kernel 9.5% 4497/Thread-20: 4.1% user + 5.4% kernel 9.5% 6670/Thread-4: 1.3% user + 8.2% kernel 9.5% 9183/Thread-5: 4.1% user + 5.4% kernel 9.5% 13140/Thread-7: 2.7% user + 6.8% kernel 8.2% 20771/binder:6113_10: 1.3% user + 6.8% kernel 102% 9948/in.games.balajimarket: 95% user + 6.3% kernel / faults: 1953 minor
修复方案
- 实现分页懒加载:不要一次性传入100条数据,改为分页加载。比如首次加载20条,监听RecyclerView滚动事件,滑动到列表底部时,在子线程加载下一批数据,加载完成后调用
adapter.notifyItemRangeInserted()更新列表,避免主线程一次性处理大量数据。 - 优化Item布局与ViewHolder:确保Item布局层级扁平化,减少嵌套;在
onBindViewHolder中禁止执行耗时操作(如同步加载图片、复杂计算),图片使用异步加载库,充分利用ViewHolder复用机制,避免重复创建View对象。 - 数据处理移至子线程:数据解析、过滤、转换等操作全部放到子线程执行,可使用Coroutines、RxJava或AsyncTask等工具,处理完成后再通知主线程更新Adapter数据。
- 禁止主线程IO操作:如果数据来自本地数据库、文件或SharedPreferences,必须放到子线程执行,IO操作是ANR的高频触发点。
- 优化内存占用:通过Android Studio Profiler排查内存泄漏或过度占用问题,比如Adapter中改用Application Context避免持有Activity强引用,及时回收无用对象,减少频繁GC导致的主线程阻塞。
内容的提问来源于stack exchange,提问作者isha sahu
相关产品推荐
相关产品推荐

