android消息机制

2019-03-02  本文已影响0人  安卓小白之小楼又东风

Android消息传递机制

标签(空格分隔): android


概述:

具体分析:

ThreadLocal
package com.example.handlerdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private ThreadLocal<Boolean> mThreadLocal = new ThreadLocal<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mThreadLocal.set(true);
        Log.d("thread1",mThreadLocal.get().toString());
        init();
    }
    public void init(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                mThreadLocal.set(false);
                Log.d("thread2",mThreadLocal.get().toString());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d("thread3",""+mThreadLocal.get());
            }
        }).start();
    }
}

log情况:

2019-02-27 17:00:16.677 3401-3401/com.example.handlerdemo D/thread1: true
2019-02-27 17:00:16.679 3401-3420/com.example.handlerdemo D/thread2: false
2019-02-27 17:00:16.680 3401-3421/com.example.handlerdemo D/thread3: null

MessageQueue工作原理

主要操作:插入和读取,enqueueMessage实际上就是链表的插入操作,next方法是一个无限循环的方法,如果消息队列没有消息,就会一直阻塞这里,新消息来之后,next返回这条消息并从消息队列中移除。

Looper工作原理

角色:消息循环,不停地从消息循环中查看是否有新消息,有新消息就会立即处理,否则就会阻塞在那里。
Looper的构造方法:

private Looper(boolean quitAllowed){
   mQueue = new MessageQueue(quitAllowed);
   mThread = Thread.currentThread();
}

在线程中创建Looper:

 /*
          Looper.prepare为当前线程创建一个Looper
           Looper.loop()让消息循环
        */
        new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                Handler handler = new Handler();
                Looper.loop();
            }
        }).start();

关于主线程:可以通过prepare和prepareMainLooper创建Looper,通过getMainLooper可以在任何地方获取主线程Looper。
Looper退出:quit会直接退出Looper,quitSafety会在消息处理完毕后退出Looper。
looper.loop是一个死循环,唯一跳出循环的方法是MessageQueue的next方法返回为null,返回不为空时,Looper处理消息,最终又交给dispatchMessage方法来处理,自然就完成线程切换。

Handler的工作原理

工作:消息的发送和接受

 public void dispatchMessage(Message message){
        if(message.callback != null){
            handleCallback(message);
        }else{
            if(mCallback != null){
                if(mCallback.handleMessage(message)){
                    return;
                }
            }
            handleMessage(message);
        }
    }

Handler的特殊构造函数:

public Handler(Looper looper){
  this(looper,null,false);
}

所以创建handler时必须先创建Looper。

上一篇 下一篇

猜你喜欢

热点阅读