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

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