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线程向自定义线程发送消息

转载于:https://blog.51cto.com/1137907860/1675976

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

  1. strongswan libstrongswan scheduler,processor,job,event和thread之间的关系

    目录 scheduler介绍 scheduler调度的event与job的关系 scheduler的主要操作 job又是如何创建的呢? job的执行 scheduler介绍 scheduler使用he ...

  2. 多线程并发可能遇到的问题及Runable和Thread之间的关系

    一.多线程并发可能遇到的问题 多线程并发执行可能会导致一些问题: 安全性问题:在单线程系统上正常运行的代码,在多线程环境中可能会出现意料之外的结果. 活跃性问题:不正确的加锁.解锁方式可能会导致死锁或 ...

  3. 理清ThreadLocal、ThreadLocalMap、Thread之间的关系

    引言 这三种的关系由于大量的内部类的关系,第一次看的时候还是有点绕的,感觉你是老子的孙子,又是老子的老子.我还是建议你先抛开内部类的关系,把每一个类当作普通类来看到,理解每個类的职责,最后再把内部类放 ...

  4. Android -- 消息处理机制源码分析(Looper,Handler,Message)

    android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...

  5. android的消息处理机制(图+源码分析)——Looper,Handler,Message

    android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种helper类,对于和我一样渴望水平得到进阶的人来说,都太值得一读了.这不,前几天为了了解android ...

  6. 【转】android的消息处理机制(图+源码分析)——Looper,Handler,Message

    原文地址:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html#!comments 作为一个大三的预备程序员,我学习 ...

  7. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

    文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...

  8. 【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )

    文章目录 I . Handler 机制简介 II . Handler 机制 Handler Message Looper MessageQueue 四组件对应关系 III . Handler ( 消息 ...

  9. android的消息处理机制(图文+源码分析)—Looper/Handler/Message[转]

    from:http://www.jb51.net/article/33514.htm 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想.andro ...

最新文章

  1. Oracle 跨resetlogs的恢复
  2. @scheduled 执行一次_springboot 定时任务Scheduled(注解方式实现)参数 说明
  3. 入门Java要学习的一些基本和高级工具
  4. 0301 - 一个比价的小项目
  5. HTTP-FLV的两种方式
  6. 熊猫数据集_对熊猫数据框使用逻辑比较
  7. Java (jdk win 10)
  8. sql 从一张表修改另一张表
  9. WebLogic plugin for juno下载地址
  10. n维椭球体积公式_加速度计 椭球校准 (最小二乘法 椭球拟合)
  11. 面向对象程序设计的4个主要特点
  12. jdk和tomcat环境变量批处理(.bat)
  13. Windows 平台上使用 cwRsync做文件同步
  14. 解读SPSS多元方差分析中的多因素多变量的相互影响
  15. 基于cnn的人脸识别_人脸识别技术全面总结:从传统方法到深度学习
  16. 【电脑办公软件有哪些】万彩办公大师教程丨PDF分割帮助文档
  17. Raven2靶机练习
  18. 谈谈Android 6.0 的动态权限管理
  19. centos 7 查看磁盘io ,找出占用io读写很高的进程
  20. FL Studio中音频ASIO4ALL的设置

热门文章

  1. Android MonkeyRunner
  2. XSS CSRF 攻击
  3. 手把手教你Dojo入门
  4. JSP内置对象之九——config
  5. Navicat15连接Oracal失败解决办法
  6. 离线安装pymysql和dbutils
  7. ROS Image_transport使用
  8. java反射获取注解id,通过反射获取注解(Annotation)
  9. Sql语句实现某列每条记录与同列最大值的差值计算
  10. 安卓9.0官方系统升级包_想升级鸿蒙系统都来看看!华为新系统升级名单曝光:有你手机吗?...