在议安卓中的消息机制

Posted 麦哈顿博士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在议安卓中的消息机制相关的知识,希望对你有一定的参考价值。

  每一个Context都有一个Looper处理各个Handler发送过来的消息,Looper处理消息的函数是:

msg.target.dispatchMessage(msg);

  这里msg是Handler传送给Looper的消息,msg绑定了Handler,这样就不会出现Message搞错Handler的情况,在看Handler中的dispatchMessge(..)源码:

/**
     * Handle system messages here.
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

  这里是处理消息的,细分为三种:

1.先是Message的callback处理消息,如果为空继续

2.在是Handler的callback接口处理消息,如果为空继续

3.最后是处理消息的是Handler的handleMessage(..)方法。

下面的程序主要验证了这三种方式:

public class MainActivity extends AppCompatActivity {
    private Button btn_send,btn_start,btn_begin;
    private myHandler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_send = (Button) findViewById(R.id.btn_send);
        btn_start = (Button) findViewById(R.id.btn_start);
        btn_begin = (Button) findViewById(R.id.btn_begin);
        func();
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.sendEmptyMessageDelayed(10000, 1000);
                handler.sendEmptyMessageDelayed(10001, 2000);
                handler.sendEmptyMessageDelayed(10002, 4000);
            }
        });
        btn_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyThread();
            }
        });
        btn_begin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                * 在子线程中发送消息*/
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message msg = Message.obtain();
                        msg.what = 10000;
                        /*注意这里在子线程初始化Handler一定要传入主线程里的Looper,不然会出错,
                        * 这是因为获取消息的Looper是在主线程*/
                        handler = new myHandler(MainActivity.this.getMainLooper());
                        handler.sendMessage(msg);
                    }
                }).start();
            }
        });
    }

    /* (1) to schedule messages and
    * runnables to be executed as some point in the future;*/
    private void func(){
        /*定义handler的时候已经实现了Callback接口,重写handlerMessage(..)方法处理消息*/
        handler = new myHandler(new Handler.Callback() {
            @Override
            //重写接口中的handleMessage(..)方法
            public boolean handleMessage(Message msg) {
                switch (msg.what){
                    case 10000:
                        System.out.println("执行handler接口回调:10000");
                        break;
                    case 10001:
                        System.out.println("执行handler接口回调:10001");
                        break;
                    case 10002:
                        System.out.println("执行handler接口回调:10002");
                        break;
                    default:break;
                }
                //这里如果返回的是true,那么执行完这里,还将执行Handler重写的
                //void handleMessage(Message msg)方法。如果返回ture就不执行
                return true;
            }
        });
    }

    /*
     * to enqueue an action to be performed on a different thread than your own.*/
    private void MyThread(){
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                /*初始化Message的时候指定了回调,这里其实是一个子线程,如果指定了Message回调
                * 那么这里会优先执行,而不是执行Handler里的回调函数*/
                Message msg = Message.obtain(handler, new Runnable() {
                    @Override
                    public void run() {//指定message的回调
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("执行Message的回调");
                    }
                });
                msg.what = 10000;
                handler.sendMessageDelayed(msg,3000);
            }
        });
        t.start();
    }
    private class myHandler extends Handler{
        /*
        *重写Handler类中的handleMessage(..)方法处理消息
        * */
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 10000:
                    System.out.println("执行Handler中重写的HandleMessage方法:10000");
                    break;
                case 10001:
                    System.out.println("执行Handler中重写的HandleMessage方法:10001");
                    break;
                case 10002:
                    System.out.println("执行Handler中重写的HandleMessage方法:10002");
                    break;
                default:break;
            }
        }

        public myHandler(Callback callback) {
            super(callback);
        }
        public myHandler(Looper looper) {
            super(looper);
        }
    }
}

xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.skymaster.hs.review.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send"
        android:textSize="30sp"
        android:id="@+id/btn_send"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start"
        android:textSize="30sp"
        android:id="@+id/btn_start"
        android:layout_below="@id/btn_send"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Begin"
        android:textSize="30sp"
        android:id="@+id/btn_begin"
        android:layout_below="@id/btn_start"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>
View Code

 

以上是关于在议安卓中的消息机制的主要内容,如果未能解决你的问题,请参考以下文章

handle机制的原理

android(安卓)消息机制

安卓Handler消息处理机制详解

安卓。通过从片段中的按钮调用片段中的方法来关闭片段?

安卓的存储机制

android的消息处理机制