如何避免ANR - MrWu94/AndroidNote GitHub Wiki

哪些操作会导致ANR 在主线程执行以下操作:

1、高耗时的操作,如图像变换 2、磁盘读写,数据库读写操作 3、大量的创建新对象

如何避免

1、UI线程尽量只做跟UI相关的工作 2、耗时的操作(比如数据库操作,I/O,连接网络或者别的有可能阻塞UI线程的操作)把它放在单独的线程处理 3、尽量用Handler来处理UIThread和别的Thread之间的交互

解决的逻辑

1、使用AsyncTask

  • 在doInBackground()方法中执行耗时操作
  • 在onPostExecuted()更新UI

2、使用Handler实现异步任务

  • 在子线程中处理耗时操作
  • 处理完成之后,通过handler.sendMessage()传递处理结果
  • 在handler的handleMessage()方法中更新UI
  • 或者使用handler.post()方法将消息放到Looper中

参考链接:https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/ANR%E9%97%AE%E9%A2%98.md