2.基础知识Android消息处理机制

版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-) https://blog.csdn.net/qq_33443989/article/details/77074579

1>. 必备的相关知识 之 消息处理机制

1<. 线程概念

1<. 一个应用程序运行时它的主体被称为进程,一个进程内部可以有多个线程。线程共享进程的资源
2<. 线程间通信
  1<. epoll
    1<. 解释:实际上用 epoll 机制创建了一个 PIPO 管道

2<. Android消息处理机制:Handler, MessageQueue, Looper, Thread

1<. 创建MessageQueue : Looper.prepare

2<. 使用Handler构造,发送Message
  1<. new Handler
  2<. 调用Handler.sendMessage / sendEmptyMessageAtTime / sendMessageDelayed 来发送消息
    最终将消息放入消息队列:queue.enqueueMessage(msg, uptimeMillis);

3<. 使用Looper循环处理:
    for (;;) {
        1<. /* 从MessageQueue中取出 */
            Message msg = queue.next();

        2<. /* 执行 */
            msg.target.dispatchMessage(msg); 
                /*target 是 Handler的实例化对象*/
                Handler.dispatchMessage()
                     /* 回掉函数存在就调用 */
                     if (msg.callback != null) {
                         handleCallback(msg);
                     }else if (mCallback != null) {
                         /* 或者在实例化Handler时传入过callback */
                         mCallback.handleMessage(msg)
                     }else { 
                         /* 空操作 */
                         handleMessage(msg);
                     }
    }

3<. 写代码验证

1<. 创建子线程

2<. 添加消息处理功能

3<. 给Button添加处理函数

示例代码:

1<. 采用自己实现类的来验证

package com.becauseican.app_addons_0001_message;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import java.util.Queue;

public class MainActivity extends Activity {
    private final String TAG = "MessageTest";
    private Button mSendButton = null;
    private int iButtonCnt = 0;
    private Thread mMyThread = null;
    private MyThread mMyThread2 = null;
    private Handler mHandler = null;
    private int mMessagecnt = 0;

    /* 自定义内部类:实现子线程消息的打印 */
    class MyRunnable implements Runnable {
        @Override
        public void run() {
            int cnt = 0;
            for (;;) {
                try {
                    Log.d(TAG, "MyThread 1 : " + cnt);
                    cnt++;
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /* 自定义内部类:实现 ref : HandlerThread.java*/
    class MyThread extends Thread {
        private Looper mLooper;

        @Override
        public void run() {
            super.run();
            Looper.prepare();

            synchronized (this) {
                mLooper = Looper.myLooper();
                notifyAll();
            }

            Looper.loop();
        }

        public Looper getLooper() {
            if (!isAlive()) {
                return null;
            }

            // If the thread has been started, wait until the looper has been created.
            synchronized (this) {
                while (isAlive() && mLooper == null) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                    }
                }
            }
            return mLooper;
        }
    }

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

        mSendButton = (Button) findViewById(R.id.SendButton);
        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "Send Message " + iButtonCnt );
                iButtonCnt++;

                Message msg = new Message();
                mHandler.sendMessage(msg);
            }
        });

        /* 创建一个子线程 : 缺点无法拓展更多的函数 */
        mMyThread = new Thread(new MyRunnable(), "MessageTestTread");
        mMyThread.start();

        mMyThread2 = new MyThread();
        mMyThread2.start();

        mHandler = new Handler(mMyThread2.getLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                Log.d(TAG, "get Message " + mMessagecnt);
                mMessagecnt++;
                return false;
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

2<. 采用 HeadlerThread.java 来实现

package com.becauseican.app_addons_0001_message;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import java.util.Queue;

public class MainActivity extends Activity {
    private final String TAG = "MessageTest";
    private Button mSendButton = null;
    private int iButtonCnt = 0;

    private Thread mMyThread = null;

    private MyThread mMyThread2 = null;
    private Handler mHandler2 = null;
    private int mMessagecnt2 = 0;

    private HandlerThread mMyThread3 = null;
    private Handler mHandler3 = null;
    private int mMessagecnt3 = 0;

    /* 自定义内部类:实现子线程消息的打印 */
    class MyRunnable implements Runnable {
        @Override
        public void run() {
            int cnt = 0;
            for (;;) {
                try {
                    Log.d(TAG, "MyThread 1 : " + cnt);
                    cnt++;
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /* 自定义内部类:实现 ref : HandlerThread.java*/
    class MyThread extends Thread {
        private Looper mLooper;

        @Override
        public void run() {
            super.run();
            Looper.prepare();

            synchronized (this) {
                mLooper = Looper.myLooper();
                notifyAll();
            }

            Looper.loop();
        }

        public Looper getLooper() {
            if (!isAlive()) {
                return null;
            }

            // If the thread has been started, wait until the looper has been created.
            synchronized (this) {
                while (isAlive() && mLooper == null) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                    }
                }
            }
            return mLooper;
        }
    }

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

        mSendButton = (Button) findViewById(R.id.SendButton);
        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "Send Message " + iButtonCnt );
                iButtonCnt++;

                Message msg = new Message();
                mHandler2.sendMessage(msg);

                mHandler3.post(new Runnable() {
                    @Override
                    public void run() {
                        Log.d(TAG, "get Message for Thread3 : " + mMessagecnt3);
                        mMessagecnt3++;
                    }
                });
            }
        });

        /* 采用 自己实现的类来实现 __Start*/
        /* 创建一个子线程 : 缺点无法拓展更多的函数 */
        mMyThread = new Thread(new MyRunnable(), "MessageTestTread");
        mMyThread.start();

        /* 使用这种方式可以,自己拓展函数 */
        mMyThread2 = new MyThread();
        mMyThread2.start();

        mHandler2 = new Handler(mMyThread2.getLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                Log.d(TAG, "get Message " + mMessagecnt2);
                mMessagecnt2++;
                return false;
            }
        });
        /* 采用 自己实现的类来实现 __End*/


        /* 采用HandlerThread来实现 __Start*/
        mMyThread3 = new HandlerThread("MessageTestThread3");
        mMyThread3.start();
        mHandler3 = new Handler(mMyThread3.getLooper());
        /* 采用HandlerThread来实现 __End*/
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33443989/article/details/77074579