Android线程之Handler(了解篇)

注意:本篇文章是本人阅读相关文章所写下的总结,方便以后查阅,所有内容非原创,侵权删。

本篇文章内容来自于:
Android中Handler的使用

目录

  1. Handler 多线程通信的桥梁
    --3.1 Handler到底是什么?(每个Handler都关联了一个线程)
    --3.2 Handler的应用
    --3.3 创建Handler的方式
    --3.4 使用Handler在多线程间发送消息

3. Handler 多线程通信的桥梁

每个平台都存在从一个新线程中去更新UI线程中创建的UI控件的问题。
不同的平台提供了不同的解决方案以实现跨线程更新UI控件。
Android为了解决这种问题引入了Handler机制。

3.1 Handler到底是什么?

Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制。

每个Handler都关联了一个线程,每个线程内部都维护了一个消息队列MessageQueue,这样Handler实际上也就关联了一个消息队列。

可以通过Handler将Message和Runnable对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后该消息队列一直在循环拿出一个Message,对其进行处理,处理完之后拿出下一个Message,继续进行处理,周而复始。

当创建一个Handler的时候,该Handler就绑定了当前创建Hanlder的线程。从这时起,该Hanlder就可以发送Message和Runnable对象到该Handler对应的消息队列中,当从MessageQueue取出某个Message时,会让Handler对其进行处理。

3.2 Handler的应用

Handler可以用来在多线程间进行通信。
Handler是Thread的代言人,是多线程之间通信的桥梁,通过Handler,我们可以在一个线程中控制另一个线程去做某事。

  • 在另一个线程中去更新UI线程中的UI控件
  • 每个Handler都绑定了一个线程,假设存在两个线程ThreadA和ThreadB,并且HandlerA绑定了 ThreadA,在ThreadB中的代码执行到某处时,出于某些原因,我们需要让ThreadA执行某些代码,此时我们就可以使用Handler,我们可以在ThreadB中向HandlerA中加入某些信息以告知ThreadA中该做某些处理了。

3.3 创建Handler的方式

1. public Handler()

public class MainActivity extends BaseActivity {
    //在执行new Handler()的时候,默认情况下Handler会绑定当前代码执行的线程
    //handler在主线程中创建,所以自动绑定主线程
    private Handler handler = new Handler();
    ....
}

2. public Handler(Looper looper)

3.4 使用Handler在多线程间发送消息

Handler提供了2种方式来进行线程间通信,一种是通过post方法,一种是调用sendMessage方法。
1.通过post(runnable)方法

public class MainActivity extends BaseActivity {
    //在执行new Handler()的时候,默认情况下Handler会绑定当前代码执行的线程
    //handler在主线程中创建,所以自动绑定主线程
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyThread myThread = new MyThread();
        myThread.start();
    }

    class MyThread extends Thread {
        @Override
        public void run() {

            //...

            //向另外一个线程发送消息
            //运行Runnable代码的线程与Handler所绑定的线程是一致的
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    //进行操作
                }
            };
            handler.post(runnable);
        }
    }
}

2.调用sendMessage(Message)方法

public class MainActivity extends BaseActivity {

    //在执行new Handler()的时候,默认情况下Handler会绑定当前代码执行的线程
    //handler在主线程中创建,所以自动绑定主线程
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    //执行操作
                    Log.d("xl", msg.arg1 + "," + msg.arg2);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyThread myThread = new MyThread();
        myThread.start();
    }

    class MyThread extends Thread {
        @Override
        public void run() {

            //...

            //向另外一个线程发送消息
            Message msg = new Message();
            //虽然Message的构造函数式public的,我们也可以通过以下两种方式通过循环对象获取Message
            //Message msg = Message.obtain(handler);
            //Message msg = handler.obtainMessage();

            //what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别
            //出不同的Message,以便我们做出不同的处理操作
            msg.what = 1;

            //我们可以通过arg1和arg2给Message传入简单的数据
            msg.arg1 = 123;
            msg.arg2 = 321;
            //我们也可以通过给obj赋值Object类型传递向Message传入任意数据
            //msg.obj = null;
            //我们还可以通过setData方法和getData方法向Message中写入和读取Bundle类型的数据
            //msg.setData(null);
            //Bundle data = msg.getData();

            handler.sendMessage(msg);
        }
    }
}

你可能感兴趣的:(Android线程之Handler(了解篇))