版权声明:本文为博主(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);
}
}