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?在我们的应用程序当中为了实现 ...
随机推荐
- mysql 二进制日志后缀数字最大为多少
之前看到mysql二进制日志后面会加一个以数字递增为结尾的后缀,一直在想当尾数到达999999后会发生什么情况,先查了一下官网,对后缀有这样一句介绍:The server creates binary ...
- linux useradd 命令基本用法
在 Linux 中 useradd 是个很基本的命令,但是使用起来却很不直观.以至于在 Ubuntu 中居然添加了一个 adduser 命令来简化添加用户的操作.本文主要描述笔者在学习使用 usera ...
- When using SqlDependency without providing an options value, SqlDependency.Start() must be called prior to execution of a command added to the SqlDependency instance.
在调试SignalR程序时,提示一个异常:When using SqlDependency without providing an options value, SqlDependency.Star ...
- IT技术开发人员获得成功的六大步骤
IT技术开发人士成功的6大步骤 一个前辈在移民加拿大后写的文章,写得不错,值得借鉴,转来给大家看看,也给自己 序言:经过001多年的洗礼,认识了这里这么多的JJMMGGDD,前几天刚得到签证, 无 ...
- ComboBoxEdit设置选项值(单选 多选)
网上搜索的 例子 加 自己的 一点点补充 lookupedit 设置选项值: private void LookUpEditFormTest_Load(object sender, EventArgs ...
- C#--异步显示工作进度
耗时的操作在长时间运行时可能导致用户界面停止响应,这时需要把操作转移到单独的线程上运行,保证当前用户界面可以继续流畅交互,同时还需要实时了解独立线程上的任务进度.可以使用BackgroudWorker ...
- mybatis xml 中的特殊符转义字符号和模糊查询
xml特殊符号转义写法 < < 小于 <= <= 小于或等于 > > 大于 >= >= 大于或等于 <> <> 不等于 & ...
- Java就业指导
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些内 ...
- sso demo 取消https (cas)
基本配置 参考之前得随笔 http://www.cnblogs.com/rocky-fang/p/5354947.html 1. 修改tomcat-cas 配置 1.1 在 D:\test\sso\ ...
- Spring中的通知(Advice)和顾问(Advisor)
在Spring中,目前我学习了几种增强的方式,和大家分享一下 之前的话: 1.AOP (Aspect Oriented Programming 面向切面编程) 在软件业,AOP为Aspect O ...