关于Handler的简单总结

1.Handler的主要作用:
     1.在新启动的线程当中发送消息。
     2.在主线程中获取并处理消息。
2.为什么要使用Handler?
    如果不用handler发送消息,然后更新UI可以么?
    是不行的。
    Android在设计时就封装了一套消息发送,传递,处理机制,如果不遵循这样的机制,就没有办法更新UI,
    就会抛出异常信息。
3.Handler的两个用途
    1.合理调用安排消息和Runnable对象,使他们在将来的某个点上执行。
    2.将一个消息放入到消息队列当中,安排他在非当前线程当中执行。
4.主线程当中已经包含了消息队列MessageQueue,所以handler才能发送处理消息。
  开启一个activity时,是否只有一个线程。
  不是的,activity生命周期的每一个方法,在开始时都是在其他线程当中的,通过消息处理机制回到了主线程。
5.Message的使用
   Message是线程之间传递消息的载体,在其中包含了对消息的描述和任意的数据对象。
获取message的三种方法:
   1.通过构造函数来获取:  Message msg = new Message();   
   2.Message的静态方法:   Message.obtain();
   3.Handler的静态方法:   Handler.obtainMessage();
   建议使用后两种方法,因为Message的实现中包含了回收在利用机制,可以提高效率,降低内存消耗。
6,分析android当中的消息处理机制
Handler  Message   Looper  MessageQueue

Looper  线程的魔法师
Looper是循环者,可以把普通线程变成循环线程。
class LooperThread extends Thread {
       public Handler mHandler;
        public void run() {
            Looper.prepare();    //将当前线程初始化为Looper线程
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
                    // process incoming messages here
                }
            };
            Looper.loop();    //开始循环处理消息队列
        }
    }
关于Looper的理解的总结:
   1.每个线程有且最多只有一个Looper对象,它是一个ThreadLocal(线程本地存储对象)。
   2.Looper内部有一个消息队列,loop()方法调用后,线程可以不断的从队列中取出消息执行。

   3.Looper可以使普通线程编程循环线程

实例一:实现轮播图片

public class MainActivity extends Activity {
	private ImageView iv;
	private Handler handler = new Handler();
	//把图片资源放置到数组当中。
	private int imgs[] = {R.drawable.d_chanzui,R.drawable.d_haha,R.drawable.d_haixiu,R.drawable.d_hehe,R.drawable.d_ku};
	//当前被切换到的图片的索引。
	private int index;
	private MyRunnable runnable = new MyRunnable();
	boolean isChange = true;
	private Button btn;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv = (ImageView)findViewById(R.id.iv);
		btn = (Button)findViewById(R.id.stop);
		handler.postDelayed(runnable, 2000);
		btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (isChange) {
					handler.removeCallbacks(runnable);
					btn.setText("点击切换");
					isChange = false;
				}else {
					btn.setText("停止切换");
					handler.postDelayed(runnable, 2000);
					isChange = true;
				}
			}
		});
	}
	class MyRunnable implements Runnable{
		@Override
		public void run() {
			index++;      //索引坐标增加
			index = index%5;  //为了能够确保是5张图片循环滚动,不会数组越界
			iv.setImageResource(imgs[index]);
			//每隔2秒发送一个runnable对象,从而实现循环。
			handler.postDelayed(runnable, 2000);
		}
	}
}
实例二:拦截消息

public class MainActivity extends Activity {

	private TextView tv;
	private Handler handler = new Handler(){
		
		public void handleMessage(android.os.Message msg) {
			if (msg.what==1) {
				String str = (String) msg.obj;
				tv.setText(str);
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView)findViewById(R.id.tv);
		
	}

	public void click(View view){
		switch (view.getId()) {
		case R.id.sendbtn:
			new Thread(){
				
				public void run() {
					Message msg = Message.obtain();
					msg.what = 1;
					msg.obj = "你能拦截到我么?";
					handler.sendMessageDelayed(msg, 5000);
				}
				
			}.start();
			break;
		case R.id.interuptbtn:
			handler.removeMessages(1);
			tv.setText("拦截成功!!");
			break;
		default:
			break;
		}
	}

}

实例三:多种方法更新UI

public class SecondActivity extends Activity {
	private TextView tv;
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			tv.setText("handler sendmessage method update UI....");
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
		new Thread() {
			public void run() {
				handlerPost();

				handlerSendMsg();

				runUIMethod();

			}
		}.start();

		// viewpost();
	}

	public void handlerPost() {
		handler.post(new Runnable() {

			@Override
			public void run() {
				tv.setText("handler post method update UI....");
			}
		});
	}

	public void handlerSendMsg() {
		handler.sendEmptyMessage(1);
	}

	public void runUIMethod() {
		runOnUiThread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				tv.setText("runOnUiThread method update UI....");
			}
		});

	}
	public void viewpost() {
		tv.post(new Runnable() {

			@Override
			public void run() {
				tv.setText("viewpost method update UI....");
			}
		});
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值