Android出現ANR的分析,以及TraceView的使用


  1. 主線程耗時操作超過5秒,會出現ANR無響應
    可使用TraveView查看哪個方法調用導致的,查看步驟看截圖說明:

    附:有可能看見很多操作是超過5秒的,可是別忘記了是在主線程耗時超過5秒才會導致ANR,子線程是不會,所以耗時操作需要在子線程完成。
    附:跟蹤的時間盡量短一些,問題重現即可,只有分析起來容易很多。

2.常見的導致ANR出現的因素:

1)主線程IO操作

2)死鎖

3)廣播廣播監聽器里執行耗時操作
    如果確實需要在廣播里執行耗時操作,可這樣處理:
    3-1) 方法一,使用IntentService:
        @Override
        public void onReceive(Context context, Intent intent) {
            // The task now runs on a worker thread.
            Intent intentService = new Intent(context, MyIntentService.class);
            context.startService(intentService);
        }
        public class MyIntentService extends IntentService {
               @Override
               protected void onHandleIntent(@Nullable Intent intent) {
               BubbleSort.sort(data);
           }
        }
    3-2)方法二,使用 goAsync():
        @Override
        public void onReceive(Context context, Intent intent) {
            final PendingResult pendingResult = goAsync();
            new AsyncTask<Integer[], Integer, Long>() {
               @Override
               protected Long doInBackground(Integer[]... params) {
                   // This is a long-running operation
                   BubbleSort.sort(params[0]);
                   pendingResult.finish();
               }
            }.execute(data);
        }

4)遞歸調用
        這種情況,也許單個方法的調用執行時間很短,但是遞歸調用同樣會造成ANR出現;而且這樣情況很難通過TraceView觀看出來,因為TraceView顯示的是單個方法一次調用執行時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM