ANR異常以及handle的使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章