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

来源:互联网 发布:python截取中文字符串 编辑:程序博客网 时间:2024/06/05 15:06

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

1<. 线程概念

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

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

1<. 创建MessageQueue : Looper.prepare2<. 使用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);    }}
原创粉丝点击