1. 请解释下在单线程模型中Message、Handler、Message Queue、Looper、Thread之间的关系
2. 什么是IntentService?有何优点?
1) 它是对单线程消息模型的封装
2)IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。
3. Main线程机制(单线程消息处理模型)
创建、更新UI、用户输入事件(User Input Event)处理
分析ANR机制的实现原理,有哪些对象
1) Thread
2) MessageQueue 容器保存事件 FIFO
3) Looper 监控Main线程是否空闲,同时监控事件队列中如果有事件,
将事件交给main线程处理
Looper类:为一个线程开启一个消息循环,里面有一个消息队列,新线程是没有开启消息循环的,所以需要用到Looper的方法创建消息循环(主线程除外,主线程会自动为其创建Looper对象,开启消息循环),MessageQueue存放消息和事件
Handler类:辅助类,向绑定的Looper投递消息
Looper原型:
Looper.prepare()
Looper.loop
Looper.quit
代码:package com.test.looper;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class MainActivity extends Activity {
private LooperThread looperThread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
looperThread = new LooperThread();
looperThread.start();
looperThread.getHandler().sendEmptyMessage(1);
}
class LooperThread extends Thread {
private Handler mHandler;
private final Object mSync = new Object();
public void run() {
Looper.prepare();
synchronized (mSync) {
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
Log.d("CYQ", "--->" + msg);
}
};
mSync.notifyAll();
}
Looper.loop();
}
public Handler getHandler() {
synchronized (mSync) {
if (mHandler == null) {
try {
mSync.wait();
} catch (InterruptedException e) {
}
}
return mHandler;
}
}
public void exit() {
getHandler().post(new Runnable(){
public void run() {
Looper.myLooper().quit();
}});
}
}
}注意一下几点:
1、new Handler()必须在子线程的run方法中,否则不是子线程的Handler
2、在getHandler方法中,我加入了同步,防止线程start了,但是并没有run结束,若此时直接返回mHandler会是一个null(不行可以试试,我一开始郁闷许久,最后在源码中发现有更稳定的实现,所以效仿了,
后记:
看来源码还是写得很健壮的,仍需多加学习!
总结一下(也许不对,请怀疑):
一个线程有一个对应的Looper,这个Looper就是消息循环,我理解就是提供了一个消息循环的场所,但是消息的投递,消息的处理它不做,它会绑定一个Handler,然后Handler去投递和处理消息,一个线程中实现handleMessage,另外一个线程就可以sendMessage,线程可以主或者子,进而实现线程间消息的传递。
4) Message
5) Handler
4. 模拟Main线程实现单线程消息处理模型
1) 查看Looper类的文档,创建Thread、Looper、MessageQueue和Handler对象
2) 在Activity的onCreate()方法中启动线程
3) 在按钮点击事件中从Main线程向自定义线程发送消息