Message、Handler、Message Queue、Looper、Thread之间的关系(未完成)

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

3C552FC09962472A93FBE08C179EEE8E 

 

4. 模拟Main线程实现单线程消息处理模型

1) 查看Looper类的文档,创建Thread、Looper、MessageQueue和Handler对象

    64B9966A7F8740089C0AA4C72D12A131

2) 在Activity的onCreate()方法中启动线程

    CFE70DB9F95E407F8808CF966028A1C4

3) 在按钮点击事件中从Main线程向自定义线程发送消息

    BFBE7E2806D14CDCA045735E64B8017E


你可能感兴趣的:(thread,handler,Queue,message,message,looper)