一、概念

    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. select查询时,如何把指定的行放置在最前面

    可以用case when做一个列,然后根据这个列来排序,下面给出代码 ' end) as 'abc' from table order by abc

  2. Android聚合广告AFP的对接系统设计

    工作需要,要对接阿里妈妈的广告聚合平台,简称AFP.对于一般的应用而言,想要流量变现,广告是显而易见的手段,尤其是在中国,打开一个千万级别的用户,肯定有某个地方是有对接广告的,只不过明不明显而已. 阿 ...

  3. CSS魔法堂:说说Float那个被埋没的志向

    前言  定位系统中第一难理解就是Normal flow,而第二就非Float莫属了,而Float难理解的原因有俩,1. 一开头我们就用错了:2. 它跟Normal flow靠得太近了.本文尝试理清Fl ...

  4. [译]学习IPython进行交互式计算和数据可视化(四)

    第三章 使用Python进行数字计算 尽管IPython强大的shell和扩展后的控制台能被任何Python程序员使用,但是这个工具最初是科学奖为科学家设计的.它的主要设计目标就是为使用Python进 ...

  5. 数据结构 - Codeforces Round #353 (Div. 2) D. Tree Construction

    Tree Construction Problem's Link ------------------------------------------------------------------- ...

  6. Web实时通信

    学习SignalR,可以从<实时数据显示--SignalR实例演示>http://www.cnblogs.com/insus/p/5619422.html 开始. 此篇只是把数据库的数据实 ...

  7. 关于EF的 序列化类型为“XXX”的对象时检测到循环引用。

    在用Ef的时候,也许经常会遇到循环引用的错误. 下面提供解决办法.(不是Json.Net,如果是Json.Net可以给导航属性通过增加特性标签来解决该问题) ef大多数问题,可以通过ToList()来 ...

  8. C#编程总结(五)多线程带给我们的一些思考

    C#编程总结(五)多线程带给我们的一些思考 如有不妥之处,欢迎批评指正. 1.什么时候使用多线程? 这个问题,对于系统架构师.设计者.程序员,都是首先要面对的一个问题. 在什么时候使用多线程技术? 在 ...

  9. 15天玩转redis —— 第六篇 有序集合类型

    今天我们说一下Redis中最后一个数据类型 “有序集合类型”,回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这 些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个 ...

  10. 点/边 双连通分量---Tarjan算法

    运用Tarjan算法,求解图的点/边双连通分量. 1.点双连通分量[块] 割点可以存在多个块中,每个块包含当前节点u,分量以边的形式输出比较有意义. typedef struct{ //栈结点结构 保 ...