ANR异常
概念:ANR(Application Not Responding)应用程序没有响应
原因:主线程在5秒内没有响应输入事件
导致ANR的操作:
在主线程内进行网络操作
在主线程内进行一些缓慢的磁盘操作
解决:使用线程进行网络以及复杂运算的操作
不能主线程做耗时的操作:
1 查询数据库 数据量很大
2 联网 在4.0以上的版本,都不能在主线程执行联网操作
3 磁盘扫描
4 解析大文件
由于会导致ANR异常,所以要开辟子线程进行耗时的操作,而子线程不能进行界面的更新,所以用到了handler,Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用
public class Lsn1_17_handlerActivity extends Activity {
public static final int UPDATE_INFO = 0;
private TextView tv_number;
private Handler mHandler = new Handler(){
//处理消息
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case UPDATE_INFO:
int i = (Integer) msg.obj;
tv_number.setText(i+"");
break;
default:
break;
}
};
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv_number = (TextView) findViewById(R.id.tv_number);
}
public void go(View v){
//开启子线程
new Thread(new AddTask()).start();
}
//开辟了子线程,由于子线程不能操作界面显示,主线程才能操作界面显示
//所以这时使用了handle(用于子线程和主线程之间的通讯)handler运行在主线程中
//即UI线程
private class AddTask implements Runnable{
public void run() {
// TODO Auto-generated method stub
int i = 0;
while(true){
if(i == 100){
return;
}
i++;
//消息
Message msg = new Message();
//唯一识别
msg.what = UPDATE_INFO;
//数据
msg.obj = i;
//发送消息,子线程使用sendMessage()传递(里面包含数据)这时会调用handleMessage方法
mHandler.sendMessage(msg);
SystemClock.sleep(200);
}
}
}
}