一、概念

    1、Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误。

2、HandlerThread继承于Thread,所以它本质就是个Thread。(本身是一个线程)

3、与普通Thread的差别就在于,主要的作用是建立了一个线程,并且创立了消息队列,有自己的looper,可以让我们在自己的线程中分发和处理消息。


二、注意

1、Handler的处理过程运行在创建Handler的线程里

2、一个线程对应一个Looper,一个Looper对应一个MessageQueue,一个Looper可以对应多个Handler。

3、handler应该由处理消息的线程创建。

4、handler与创建它的线程相关联,而且也只与创建它的线程相关联。handler运行在创建它的线程中,所以,如果在handler中进行耗时的操作,会阻塞创建它的线程。

5、Looper.myLooper();        //获得当前的Looper

Looper.getMainLooper()   //获得UI线程的Lopper

6、Handle的初始化函数(构造函数),如果没有参数,那么他就默认使用的是当前的Looper,如果有Looper参数,就是用对应的线程的Looper。

7、如果一个线程中调用Looper.prepare(),那么系统就会自动的为该线程建立一个消息队列,然后调用Looper.loop();之后就进入了消息循环,这个之后就可以发消息、取消息、和处理消息。

三、什么是HandlerThread

        Android的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper。事实上Android提供了一个封装好的带有looper的线程类,即为HandlerThread

四、实例1

 package app.com.myapplication;

 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.widget.Toast; /**
* Created by ${zyj} on 2016/2/15.
*
*/
public class HandlerThreadActivity extends Activity { private HandlerThread handlerThread ;
private Handler handler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 1:创建一个HandlerThread,即创建了一个包含Looper的线程。
handlerThread = new HandlerThread("leochin.com");
handlerThread.start(); //创建HandlerThread后一定要记得start() //2:获取HandlerThread的Looper
Looper looper = handlerThread.getLooper(); //3:创建Handler,通过Looper初始化
handler = new Handler(looper) { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int what = msg.what;
Toast.makeText(HandlerThreadActivity.this, "hahah" + what , Toast.LENGTH_SHORT).show();
}
}; //通过以上三步我们就成功创建HandlerThread。通过handler发送消息,就会在子线程中执行。
//如果想让HandlerThread退出,则需要调用handlerThread.quit();。 //创建一个线程发送消息
new ChildThread().start();
} class ChildThread extends Thread {
@Override
public void run() {
super.run();
try {
//在子线程中可以做一些耗时的工作
sleep( 1000 );
Message message = handler.obtainMessage();
message.what = 3 ;
handler.sendMessage(message);
}catch ( Exception e ){ }
}
}
}

实例2

 package app.com.myapplication;

 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.widget.Toast; /**
* Created by ${zyj} on 2016/2/15.
* HandlerThread继承于Thread,所以它本质就是个Thread。
* 与普通Thread的差别就在于,主要的作用是建立了一个线程,并且创立了消息队列,有来自己的looper,可以让我们在自己的线程中分发和处理消息。
*/
public class HandlerThreadActivity2 extends Activity { private MHandlerThread mHandlerThread ;
private Handler handler ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 1:创建一个HandlerThread,即创建了一个包含Looper的线程。
mHandlerThread = new MHandlerThread( "thisName" ) ;
mHandlerThread.start(); //创建HandlerThread后一定要记得start() //2:获取HandlerThread的Looper
Looper looper = mHandlerThread.getLooper(); //3:创建Handler,通过Looper初始化
//特别要注意的是handler与谁相关,不是看handler写在什么位置,而是看handler的looper跟什么相关
handler = new Handler(looper) { @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int what = msg.what;
Toast.makeText(HandlerThreadActivity2.this, "hahah" + what , Toast.LENGTH_SHORT).show();
}
}; handler.sendEmptyMessage(2) ; } class MHandlerThread extends HandlerThread {
public MHandlerThread(String name) {
super(name);
}
}
}

注意:写 MHandlerThread 的时候,最好写上线程的优选级

  class  MHandlerThread extends  HandlerThread {
public MHandlerThread(String name ) {
//设置程序的优先级(标准后台程序)
super(name , Process.THREAD_PRIORITY_BACKGROUND);
}
}

HandlerThread的更多相关文章

  1. Android HandlerThread 总结使用

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6062880.html 本文出自[赵彦军的博客] 前言 以前我在 [Android Handler.Loop ...

  2. HandlerThread 创建一个异步的后台线程

    使用HandlerThread几大优点: 1.制作一个后台异步线程,需要的时候就可以丢一个任务给它,使用比较灵活; 2.Android系统提供的,使用简单方便,内部自己封装了Looper+Handle ...

  3. 关于HandlerThread的分析

    Android中的Thread没有对java中的Thread做任何封装,而Android提供了一个遍历方法HandlerThread,他继承于Thread,实现了对遍历系统的一些封装,下面研究一下Ha ...

  4. Android HandlerThread 的使用及其Demo (转)

    转自http://www.cnblogs.com/hnrainll/p/3597246.html 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现同时完成多 ...

  5. HandlerThread和IntentService

    HandlerThread 为什么要使用HandlerThread? 我们经常使用的Handler来处理消息,其中使用Looper来对消息队列进行轮询,并且默认是发生在主线程中,这可能会引起UI线程的 ...

  6. HandlerThread源码分析

    其实原本HandlerThread的分析不应该单独开一篇博客的,应该在讲消息机制的那一片中一起分析. 但当时忘记了,而且今天第一次用MarkDown写博客,有点上瘾,就再来一篇,权当滥竽充数过过手瘾. ...

  7. 【Android】用HandlerThread模拟AsyncTask功能(ThreadTask)

    前言 AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据.同一个Activity中多个AsyncTask同时执 ...

  8. HandlerThread 用法

    HandlerThread最大的优势在于引入MessageQueue概念,可以进行多任务队列管理. HandlerThread背后只有一个线程,所以任务是串行依次执行的.串行相对于并行来说更安全,各任 ...

  9. Android HandlerThread 的使用及其Demo

    今天我们一起来学习下一个Android中比较简单的类HandlerThread,虽然它的初始化有点小麻烦. 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现 ...

随机推荐

  1. 关于WEB Service&WCF&WebApi实现身份验证之WCF篇(2)

    因前段时间工作变动(换了新工作)及工作较忙暂时中断了该系列文章,今天难得有点空闲时间,就继续总结WCF身份验证的其它方法.前面总结了三种方法(详见:关于WEB Service&WCF& ...

  2. 如果根据键盘的frame始终让一个控件始终在键盘的顶部

    我们发现很多时候系统提供的键盘功能有限 有些功能无法实现,所以我们通常的做法就是自定义一个工具条放在键盘的顶部. 那么我们如何知道键盘的frame呢? 这个时候就需要监听键盘发出的通知,在ios中当键 ...

  3. MVVM-Sidekick 之SendToEventRouterAction使用

    在WP开发中点击列表项跳转到详情页是一个很常用的功能,但是有可能项模板中还有其他的区域,比如点击标题跳转到详情页,点击"赞"图标送一个赞,点击"踩"图标踩一下, ...

  4. 一篇文看懂Hadoop:风雨十年,未来何去何从

    本文分为技术篇.产业篇.应用篇.展望篇四部分 技术篇 2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce.到现在的10个年头,这个单词代表的是“核心” ...

  5. HoverTree项目添加了查看留言列表功能

    HoverTree项目添加了查看留言列表功能 页面:HoverTreeWeb项目下hvtpanel/usermessage/messagelist.aspx 添加留言页面:addmessage.asx ...

  6. 基于.Net Framework 4.0 Web API开发(3):ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是项目,总有异常发生,本节就来谈谈API的异常 ...

  7. 对状态空间图搜索的几种算法比较(图)【深度、宽度、动态规划(均一代价)、最佳优先和A*算法】

    ---------------------------------------------------------------------------------------------------- ...

  8. 我整理的PHP 7.0主要新特性

    原文:http://php.net/manual/en/migration70.new-features.php 1.标量参数类型声明 现在支持字符串(string).整型(int).浮点数(floa ...

  9. 从零开始学Python04作业思路:模拟ATM电子银行

    标签(空格分隔):Python 一,程序文件说明 程序分为5个组成部分 bin:放置Python程序的启动接口文件 通过Python命令启动文件夹内文件即正常执行Python程序 例如:ATM_sta ...

  10. Data Structures/Algorithms 小甲鱼99讲笔记系列(1~~15讲)

    参考资料地址: http://www.icoolxue.com/ 1.数据结构中四种逻辑结构. ① 集合 集合中任何两个数据元素之间都没有逻辑关系,组织形式松散. ② 线性结构 线性结构中的 结点按逻 ...