Android 线程间通信------handler

整合代码

//总结:handler 用于 Android 线程之间的通信
public class MainActivity extends AppCompatActivity {

    final static String TAG1 = "Main";
    final static String TAG2 = "Sub";
    Handler mHandler, subHandler;
    HandlerThread handlerThread;

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

        init();
    }

    private void init() {
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Log.d(TAG1, msg.what + " -- " + Thread.currentThread().getName());
            }
        };

        handlerThread =  new HandlerThread("test_handler");
        handlerThread.start();
        //子线程从 主线程或其他子线程 收消息,再发回到主线程
        subHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                Log.d(TAG2, msg.what + " -- " + Thread.currentThread().getName());
                //子线程发送到主线程
                mHandler.sendEmptyMessage(msg.what);
                //subHandler.sendEmptyMessageDelayed(4, 1000);//自己调用自己可以达到计时器的效果
            }
        };

        //主线程发送消息到子线程
        subHandler.sendEmptyMessage(2);

        //子线程发送消息到子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                subHandler.sendEmptyMessage(3);
                //子线程中切换到UI线程
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        Log.d("NewThread", Thread.currentThread().getName());
                    }
                });
                //子线程中切换到UI线程 2
                    //runOnUiThread 当前线程在UI线程则直接run,不是则用handler发布到事件队列的UI线程
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.d("runOnUiThread", Thread.currentThread().getName());
                    }
                });
            }
        }).start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        handlerThread.quit();
    }
}

运行结果

D/Sub: 2 -- test_handler //主线程发送信息到子线程
D/Sub: 3 -- test_handler //子线程发送信息到子线程
D/Main: 2 -- main        
D/Main: 3 -- main        //子线程收到信息发送到主线程
D/NewThread: main        //子线程切换到主线程
D/runOnUiThread: main    //子线程切换到主线程

runOnUiThread 源码解析

public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) { //当前线程不是UI线程
            mHandler.post(action); //利用Activity中的Handler发布到UI线程的事件队列中
        } else {
            action.run(); //当前线程为UI线程,则直接执行
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值