<commit_before>---
layout: post
title: ANR学习笔记
category: 技术
tags: ANR
description: ANR学习笔记
---


### ANR
Android系统为了防止某些应用会在一段时间内反应迟钝，因而弹出的ANR对话框。
### ANR触发条件
- 5秒内未响应input event,包括key和touch两种事件
- 10秒内未执行完的[`BroadcastReceiver`][1]
- 20秒内未执行完的[`Service`](http://developer.android.com/reference/android/app/Service.html),注意：Service也是执行在主线程中。


### 需要注意ANR的场景
IO，网络，数据库，复杂计算（如bitmap压缩等）

### 避免ANR的方法：在UI线程外的worker thread做耗时操作。
- 简单任务->[`AsyncTask`][2]
- 复杂任务->[`HandlerThread`][3]或[`Thread`][4]，一定要设置线程优先级为[`THREAD_PRIORITY_BACKGROUND`][5]，调用的是[`Process.setThreadPriority()`][6]，不然该线程的优先级为默认，和UI线程相同，仍然会影响App速度。
- 不要使用`Thread.wait()`或`Thread.sleep()`阻塞主线程
- 响应intent broadcast并进行耗时操作->使用[`IntentService`][7]而不是BroadcastReceiver
- 使用[`StrictMode`][8]发现问题。
### 改善响应速度的方法
 - [ProgressBar][9]
 - worker thread中计算
 - 如果是应用启动耗时长，展示splash screen或尽快渲染出main view，同时显示进度
- 使用[Systrace][10]和[Traceview][11]等发现性能瓶颈

推荐阅读[shelves源码][12]，学习如何在配置改变时保存任务，在Activity销毁时取消任务。
<commit_msg>the article ANR doesnt show in blog and I try to fix it<commit_after>---
layout: post
title: ANR学习笔记
category: 技术
tags: ANR
description: ANR学习笔记
---


### ANR
Android系统为了防止某些应用会在一段时间内反应迟钝，因而弹出的ANR对话框。
### ANR触发条件
- 5秒内未响应input event,包括key和touch两种事件
- 10秒内未执行完的[`BroadcastReceiver`][1]
- 20秒内未执行完的[`Service`](http://developer.android.com/reference/android/app/Service.html),注意：Service也是执行在主线程中。


### 需要注意ANR的场景
IO，网络，数据库，复杂计算（如bitmap压缩等）

### 避免ANR的方法：在UI线程外的worker thread做耗时操作。
- 简单任务->[`AsyncTask`][2]
- 复杂任务->[`HandlerThread`][3]或[`Thread`][4]，一定要设置线程优先级为[`THREAD_PRIORITY_BACKGROUND`][5]，调用的是[`Process.setThreadPriority()`][6]，不然该线程的优先级为默认，和UI线程相同，仍然会影响App速度。
- 不要使用`Thread.wait()`或`Thread.sleep()`阻塞主线程
- 响应intent broadcast并进行耗时操作->使用[`IntentService`][7]而不是BroadcastReceiver
- 使用[`StrictMode`][8]发现问题。


### 改善响应速度的方法
 - [ProgressBar][9]
 - worker thread中计算
 - 如果是应用启动耗时长，展示splash screen或尽快渲染出main view，同时显示进度
- 使用[Systrace][10]和[Traceview][11]等发现性能瓶颈

推荐阅读[shelves源码][12]，学习如何在配置改变时保存任务，在Activity销毁时取消任务。

{'fraction_non_alphanumeric': 0.16683518705763398, 'fraction_numerical': 0.020222446916076844, 'mean_word_length': 8.4688995215311, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1679446', 'n_tokens_mistral': 1163, 'n_tokens_neox': 1308, 'n_words': 86}