Android实战开发之Handler的基本使用

1、Android多线程之间的数据通讯通过Handler来传递Message;
2、在当前线程中创建Message对象,需要发送到哪个线程就调用哪个线程当中的Handler;
3、初始化线程在Thread的构造方法中传入一个Runnable对象(抽象类),并且实现Runnable对象中的run方法;
4、调用Thread的start()方法启动线程;
5、初始化Handler在其构造方法中传入一个Callback对象(接口),并且实现该对象的handleMessage()方法;
6、消息通过handler发送后会自动回调Callback接口中的handleMessage()方法;
7、关键代码:
Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.yusian.handler;
 
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button innerBtn;
    private Handler mHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化按钮监听事件
        innerBtn = (Button)findViewById(R.id.btn_inner);
        innerBtn.setOnClickListener(this);
 
        // 初始化handler,接收到消息的处理动作
        Handler.Callback callback = new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                String str= Thread.currentThread().getName();
                System.out.println("当前线程:"+str+", 接收到"+msg.obj);
                return false;
            }
        };
        mHandler = new Handler(callback);
    }
 
    @Override
    // 按钮事件的回调方法
    public void onClick(View v) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 新线程的run方法中发送message,谁的Handler谁处理
                Message msg = new Message();
                String str = Thread.currentThread().getName();
                msg.obj = "来自线程"+str+"的消息";
                mHandler.sendMessage(msg);
            }
        };
        Thread  thread = new Thread(runnable);
        thread.start();
    }
}

运行结果:
I/System.out: 当前线程:main, 接收到来自线程Thread-617的消息
I/System.out: 当前线程:main, 接收到来自线程Thread-618的消息
I/System.out: 当前线程:main, 接收到来自线程Thread-619的消息
I/System.out: 当前线程:main, 接收到来自线程Thread-620的消息

Leave a Reply