Android消息机制-Handler(一)

Android为了线程安全,不允许我们在UI线程外(即主线程外的子线程)操作UI。

1. 子线程为啥不能操作UI呢?

试想一下,如果多个线程都可以操作UI,不同线程都可以控制同一个UI,那么势必会出现线程安全问题。线程A在修改UI的同事,线程B也在改同一个UI,抢夺资源,且不同步。所以子线程操作UI都交给UI主线程去处理

2. 子线程中更新UI的4种方法

方法 :子线程调用Handler的sendMessage(message)发送事件。
方法:Activity.runOnUiThread(Runnable )
Activity.runOnUiThread( new Runnable()
    { public void run(){更新UI}}
);
方法三:View.post(Runnable )
方法四:AsyncTask

先从Handler讲起

3. Handler的用法

Handler的使用也有两种方式,一个是在主线程 Activity 中定义 Handler,另一个是在子线程类中定义Handler

此次直说最简单的Activity 中定义 Handler,线程类中定义Handler的使用方法和原理以后再说。

A.主线程中定义Handler

Handler handler= new Handler()//在主线程中创建,所以自动绑定主线程
        {
            @Override
            public void handleMessage(Message msg) {
		  String x=(String )msg.obj;//msg.obj可以对message携带的数据进行还原,须强制类型转换
                switch (msg.what)//根据what处理不同操作
                {
                    case 1:
                        initData(true);//我自己的更新UI的方法
                        break;
                    case 2:
                        loadMoreData(page);//我自己的更新UI的方法
                        break;
                }
            }

B.  子线程中发送消息,完成UI操作

private void updateWeather() {
		
		new Thread(new Runnable(){

			@Override
			public void run() {
				//以下可以二选一
				//1.耗时操作,完成之后发送消息给Handler,完成UI更新;
				mHandler.sendEmptyMessage(0);
				
				//2.需要数据传递,用下面方法;
				Message msg =new Message();
				msg.what = 1;//what可以区分message,用于在handleMessage中识别message;
				msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;
				mHandler.sendMessage(msg);
			}
			
		}).start();
		
	}

原理下篇再讲





猜你喜欢

转载自blog.csdn.net/kangyouv/article/details/73604231