Handler-简介和用法

来源:互联网 发布:淘宝网店童装图片 编辑:程序博客网 时间:2024/06/05 02:16

Handler——简介和用法

  1. Handler中常用的四个方法:
    sendMessage(Message msg)
    sendMessageDelayed(Message msg, long delayMillis)
    post(Runnable r)
    postDelayed(Runnable r, long delayMillis)

    Handler中的message queue和javascript中的event queue的机制是一样的。

  2. handler中post传入的Runnable对象中的run方法其实是在UI线程(主线程)中被执行的,这个就是使用了Handler的第二个作用:将action传入到message queue中,然后使得action被别的线程所执行。

  3. Handler handler = new Handler(); // 创建Handler对象
    通过Handler在自定义的子线程中更新UI,否则会抛出异常的。

  4. 我们可以自己在UI线程之上再创建线程,然后我们需要通过Handler来使得我们的线程和UI线程通信。这样我们才能在我们的子线程中更新UI。因为Android中UI的更新只能在UI线程中进行。我们只能通过Handler的通信来使得我们从子线程中更新UI。

  5. 从上面的介绍我们知道,一个Handler实例其实绑定了一个关联的thread线程和那个线程的message queue;handler会讲message和runnable对象发送到它所关联的message queue中去,同时它也会执行从message queue中出来的message和runnable。

  6. Handler的两大用途:1. 在未来某个时间点执行message和runnable对象;2. 将要执行的action放到message queue中去,然后使得另外的不同的线程可以执行这个action。

  7. 使用Handler的sendMessage()和handleMessage()

    • handleMessage()
private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {mTextView.setText("" + msg.arg1);};};

主线程中新建一个Thread发送message给主线程。

new Thread() {public void run() {Message message = handler.obtainMessage();message.arg1 = 88;handler.sendMessage(message);};}.start();
  1. 移除runnable对象
    对应于handler.postDelayed(myRunnable, 2000);
    直接handler.removeCallbacks(myRunnable);
  2. 截获message
    在创建handler对象时,调用new Handler(Callback callback)方法。
private Handler handler = new Handler(new Callback() {public boolean handleMessage(Message msg) {return true; //return true就截获,return false不截获}}){public void handleMessage(Message msg) {}};

在主线程中执行handler.sendEmptyMessage(1)。其原理:
当Handler收到message时,新创建的Callback将首先执行,其handleMessage()将会处理消息;如果Callback的handleMessage()不截获消息,然后Handler才可能会收到消息。Handler的Callback用法。如果return true,则说明message被截获,下面的handleMesage方法将不会被执行。

1、使用Handler在子线程中向ui线程发送一个消息进行UI的更新;
2、创建一个Message; Message msg = new Message(); msg.arg1=88;
3、handler.sendMessage(msg); // 最终导致同一个handler对象的handleMessage()方法被创建Handler对象的线程(一般在主线程中创建)回调,然会这个传入的msg会被当成参数传给handleMessage()方法的。这个时候我们就可以对Message对象做一些处理了,而且这个时候我们所处的线程一般就在UI线程中了,所以这个时候我们更新UI就没有问题了。

msg.obj=xxx; 可以传递一个对象;

4、复用系统的message对象 Message msg = handler.obtainMessage(); // or Message.obtain();
msg.sendtoTarget(); 也可以发送到Handler对Message进行处理
handler.removeCallbacks(Runnable r);

如前面所说,我们除了在Handler对象的handleMessage()方法中处理Message对象,还可以在Handler对象创建的时候传入一个Callback对象,用这个Callback对象来处理Message对象;注意:callback接口中handleMessage(Message msg)中若截获则一定返回true;

0 0
原创粉丝点击