-
主線程耗時操作超過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顯示的是單個方法一次調用執行時間。