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); }}
阅读全文
0 0
- 2.基础知识Android消息处理机制
- 安卓核心基础知识梳理之Android消息处理机制
- Android 消息处理机制
- Android消息处理机制
- Android消息处理机制
- android消息处理机制
- android 消息处理机制
- Android消息处理机制
- Android消息处理机制
- Android消息处理机制
- Android消息处理机制
- Android消息处理机制
- Android消息处理机制
- Android消息处理机制
- android消息处理机制
- Android消息处理机制
- Android消息处理机制
- Android消息处理机制
- #pragma命令详解(一)
- 位图
- 【C语言】【unix c】大型软件组织(大型软件组织也就是如何来完成一个软件项目)
- Ubuntu 获取 imu 数据
- [模板] + [详解]
- 2.基础知识Android消息处理机制
- Android 嵌套滑动机制(NestedScrolling)
- SQL查询和优化(九)
- 北大方正声誉不佳,人寿保险业务巨亏
- visual studio 2015下载地址
- 双向链表
- springMVC拦截器执行过程和使用
- bayes
- ES6 generator 与 koa 中间件 是如何 generator解决异步的