Android的Handler使用总结

来源:互联网 发布:淘宝姐优惠券助手 编辑:程序博客网 时间:2024/05/18 18:01

前言:

由于在阅读代码时,碰到了Handler.post()方法,于是,就耐下心来查阅相关资料,现在在这里,简单做个总结;

首先,从Android Developer的官方解释可以看到:

A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue

其大体意思是:

一个Handler可以发送/处理与线程的消息队列联系在一起的Message和Runnable对象,每个Handler实体都伴随这一个线程和一个消息队列,当你创建一个新的Handler时,它会与创建Handler的这个线程及这个线程的消息队列绑定在一起;至此,Handler会发送Message/Runnable到消息队列,然后当从消息队列中取出消息时,就会去执行这些消息;


然后下面,就总结了自己在使用过程中常见的两种有关Handler的使用:

一种是通过post()方法来调用的,一种是通过sendMessage()方法来调用的;


I>Handler.post()

代码示例如下:

package com.example.dai.testjava;import android.os.Bundle;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.util.Log;public class TestHandlerActivity extends AppCompatActivity {    Handler handlerPost = new Handler();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_handler);        Log.e("currentThreadOnCreate:", "" + Thread.currentThread().getId());        testHandlerPost();    }    /***     * 第一种使用Handler的方式:     * 通过post(Runnable)方法     * **/    public void testHandlerPost(){        HandlerPostRunnable handlerPostRunnable = new HandlerPostRunnable();        handlerPost.post(handlerPostRunnable);    }    class HandlerPostRunnable implements Runnable{        @Override        public void run() {            Log.e("currentThreadRunnable:", "" + Thread.currentThread().getId());        }    }}

运行结果如下:



代码分析:

从上述,我们可以看出,Handler若在哪个线程中创建,那么与其相连的Runnable里边的run()方法就会在哪个线程中去执行;


II>Handler.sendMessage()

对于这种方法的调用,我们一般在Android的子线程中去刷新UI时会用得比较多,因为子线程是没法更新UI的,

所以就需要发送消息到主线程的handlerMessage()中去更新UI

代码示例如下:

package com.example.dai.testjava;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.util.Log;public class TestHandlerActivity extends AppCompatActivity {    Handler handlerSendMessage = new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case 0:                    /**                     * 一般在这里会用作UI的更新                     * **/                    /***                     * 当从消息队列中取出这个空消息时,                     * 就会在这里予以执行                     * **/                    Log.e("currentThreadSendMsg:", "" + Thread.currentThread().getId());                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_handler);        Log.e("currentThreadOnCreate:", "" + Thread.currentThread().getId());        testSendMessage();    }    public void testSendMessage(){        new Thread(){            @Override            public void run() {                /***                 * 发送消息到消息队列                 * **/                handlerSendMessage.sendEmptyMessage(0);            }        }.start();    }}

运行结果如下:



0 0
原创粉丝点击