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);
}
}
}
}