HandlerThread
一、概念
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的更多相关文章
- Android HandlerThread 总结使用
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6062880.html 本文出自[赵彦军的博客] 前言 以前我在 [Android Handler.Loop ...
- HandlerThread 创建一个异步的后台线程
使用HandlerThread几大优点: 1.制作一个后台异步线程,需要的时候就可以丢一个任务给它,使用比较灵活; 2.Android系统提供的,使用简单方便,内部自己封装了Looper+Handle ...
- 关于HandlerThread的分析
Android中的Thread没有对java中的Thread做任何封装,而Android提供了一个遍历方法HandlerThread,他继承于Thread,实现了对遍历系统的一些封装,下面研究一下Ha ...
- Android HandlerThread 的使用及其Demo (转)
转自http://www.cnblogs.com/hnrainll/p/3597246.html 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现同时完成多 ...
- HandlerThread和IntentService
HandlerThread 为什么要使用HandlerThread? 我们经常使用的Handler来处理消息,其中使用Looper来对消息队列进行轮询,并且默认是发生在主线程中,这可能会引起UI线程的 ...
- HandlerThread源码分析
其实原本HandlerThread的分析不应该单独开一篇博客的,应该在讲消息机制的那一片中一起分析. 但当时忘记了,而且今天第一次用MarkDown写博客,有点上瘾,就再来一篇,权当滥竽充数过过手瘾. ...
- 【Android】用HandlerThread模拟AsyncTask功能(ThreadTask)
前言 AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据.同一个Activity中多个AsyncTask同时执 ...
- HandlerThread 用法
HandlerThread最大的优势在于引入MessageQueue概念,可以进行多任务队列管理. HandlerThread背后只有一个线程,所以任务是串行依次执行的.串行相对于并行来说更安全,各任 ...
- Android HandlerThread 的使用及其Demo
今天我们一起来学习下一个Android中比较简单的类HandlerThread,虽然它的初始化有点小麻烦. 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现 ...
随机推荐
- git命令使用记录
github网络连接稍微有些慢,这里使用coding做测试: 首先要分两种情况,一种是直接clone远程库,一种是将本地的代码push到远程库.先说clone到本地 1.clone 通常是我们clon ...
- .NET平台下开源框架
一.AOP框架Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(asp ...
- Angular 1与 Angular 2之间的一些差别
现在在用ng1.5.8做一个项目,ng的优点和特性我就不用多说了,ng1在陆续更新到1.5/1.6后就没再推出新版本了,ng2已经面世测试很久了,如同很多系统和框架一样,每个大的版本更新都会有新特性加 ...
- 关于Html与css的一些解释
一.简单介绍 1.html,是hyper text markup language的缩写,中文为“超文本标记语言”. 2.html不是编程语言而是一种标记语言. 二.标签与元素 1.html标签:如& ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)
这个系列已经写了6篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Auto ...
- PHP 判断是否为 AJAX 请求
先说前端使用 jQuery 时怎么区分: jQuery 发出 ajax 请求时,会在请求头部添加一个名为 X-Requested-With 的信息,信息内容为:XMLHttpRequest 在后端可以 ...
- C#正则表达式教程和示例
有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的<C#字符串和正则表达式参考手册>学习了一些基础的知 ...
- 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载
在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...
- 新型编译器将原生代码转换为JavaScript
导读:Emscripten C/C++到JavaScript项目利用来自LLVM的后端构建起更具速度与针对性优势的编译方案. 在当初刚刚公布时,Emsripten听起来完全像是个冲劲十足的技术笑谈:一 ...
- Winform 导入导出方法
导出时:引用 using Excel = Microsoft.Office.Interop.Excel; #region 读取excel //打开方法 public DataTable Excelto ...