异步消息处理机制

  1. Message.线程间传递消息
  2. Handle.发送和处理消息,利用sendMessage()发送消息,handleMessage()处理消息
  3. MessageQueue.消息队列,用于存放所有message,每个线程只有以一个MessageQueue对象
  4. Looper.是MessageQueue的管家,发现MessageQueue有消息时将它取出
public class MainActivity extends AppCompatActivity {
    private static final int CHANGE_ID=1;
    private TextView textView;
    private Handler handler = new Handler(){   //创建handle对象
        @Override
        public void handleMessage(Message msg) {    //处理message的逻辑
            switch(msg.what){         //根据msg.what对message进行匹配
                case CHANGE_ID:
                    textView.setText("hellllo worlllld");
                    break;
                default:
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.text) ;
        Button button = (Button)findViewById(R.id.changeText);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable(){ 
                    @Override
                    public void run() {
                        Message  message = new Message();
                        message.what = CHANGE_ID;
                        handler.sendMessage(message);
                    }
                }).start();
            }
        });
    }
}

handler.post(Runnable r)的用法

        new Thread(){
            @Override
            public void run() {
                handler.post(new Runnable() {//传入runnable接口
                    @Override
                    public void run() {
                        textView.setText("我是第三个线程的");
                    }
                });
            }
        }.start();

内部实现流程图:
异步消息处理机制_第1张图片
阅读源码的一点认识
1、打开一个应用,会在ActivityThread中执行Loop.prepareMainLooper()–(创建Loop对象)和Loop.loop()方法—(不断去获取消息)
2、通过handler的sendMessage(msg)来发送一条消息
这个方法会调用Handler的enqueueMessage()方法(同时将msg.target=this),将执行MessageQueue的enqueueMessage方法,将这个消息插入到队列中(怎么确保这个msgqueue和loop中的一致呢?handle中有两个对象引用Loop和msgQueue,其中msgQueue=Loop中的msgqueue)
3、然后在上面的Loop.loop()方法中会调用msgqueue的msgqueue.next()方法来获取对应的msg,然后通过msg.target.dispatchMessage(msg)来分发这个msg,在handler中dispatchMessage会调用handlerMessage

你可能感兴趣的:(Android开发)