anr :application not response 应用程序无响应
anr 参数的原因:主线程 需要做很多重要的事情 ,响应点击事件,更新ui 如果在主线程里面阻塞过久时间应用程序就会无响应,
为了避免应用程序出现anr ,所有的耗时的操作都应该放在子线程里面执行。
在哪个线程操作的view其他的线程不能操作此view ui
在主线程中更新UI 但在子线程中我们也想更新UI则 应该在主线程中有一个handler (消息处理器) 利用handler发送一个消息
1.子线程利用handler发送一条消息 消息会被放在主线程的消息队列里面;
2.主线程里面有一个looper消息的轮询器;
3.如果轮询器发现了新的消息,调用handlermessage的方法处理消息。
//创建一个消息处理器
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == CHANGE_UI){
Bitmap bitm = (Bitmap) msg.obj;
iv.setImageBitmap(bitm);
}else if(msg.what == ERROR){
Toast.makeText(MainActivity.this, "请求处错误!!!", 0).show();
}
};
};
//向主线程添加消息
Message msg = new Message();
msg.what = CHANGE_UI;
msg.obj = bitmap;
handler.sendMessage(msg);
也可以有一个runOnUiThread(new Runable()){
public void run(){
改变UI的代码
}
};