程序猿大本营测试与日志Android技术知识

聊聊 Android ANR 那点事儿

2016-11-06  本文已影响1048人  無名小子的杂货铺
ANR 弹窗

ANR 在 Android开发中并不陌生,遇到 ANR 有时让我们很苦恼,自己平时也遇到过这样的问题,今天来聊聊 Android 中 ANR 那点事并记录在此,以防下次遇到我们就知道该如何分析了。

ANR定义

简单说下官方解释,ANR,Application Not Responding,即应用程序没有响应,Android 系统会向用户显示一个程序无响应对话框,用户可以选择等待或者强制关闭。

出现场景

发生 ANR 基本上都会出现无法响应对话框,除了一些后台程序的 ANR,造成 ANR 的原因很多,比如:

如何分析

关于发生 ANR 截取的 log 和 trace 这里就不多说了

1、CPU 问题

2、GC 问题

注意:发生 GC 的进程 id 需要和当前发生 ANR 的线程 id 的要一致

如何避免

比如官方例子中:

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     // Do the long-running work in here
     // 耗时操作放这里
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     // This is called each time you call publishProgress()
     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     // This is called when doInBackground() is finished
      // 耗时操作完成后 Post 到 UI 主线程
     protected void onPostExecute(Long result) {
         showNotification("Downloaded " + result + " bytes");
     }
 }

友好处理

一般情况下, 超过100至200毫秒用户会感知程序有些缓慢。因此,可以做一些比较友好的 UI 提示页面,比如:ProgressBar,来表明当前正在处理,使得用户不会去一直点击页面,减少输入即可能减少 ANR 出现几率,因为按键5s不响应是会出现 ANR 的。

可以使用性能工具来优化我们的 App,如 SystraceTraceview

关于内存泄露分析可以查看之前总结的 Android 内存泄漏工具使用分析
如果有错,欢迎大家指正!

参考

官方文档
Android 内存泄漏工具使用分析
Keeping Your App Responsive

上一篇下一篇

猜你喜欢

热点阅读