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?在我们的应用程序当中为了实现 ...
随机推荐
- Windows Azure Web Site (6) 使用FTP发布Azure Web Site
<Windows Azure Platform 系列文章目录> 笔者在之前的文章中介绍的都是使用IDE,也就是Visual Studio,将本地的aspx发布到Azure Web Site ...
- velocity分页模板
以前用后台java拼接分页代码,不利于修改.找到一份velocity模板. <!-- 分页模板 --> #macro(pager $url $pager) <url class=&q ...
- 笔记:Html.Partial和Html.Action
1.带有Render的方法返回值是void,在方法内部进行输出:不带的返回值类型为MvcHtmlString,所以只能这样使用:@Html.Partial 对应 @{Html.RenderPartia ...
- .NET平台下开源框架
一.AOP框架Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(asp ...
- VMware安装Elementary OS 后不能上网问题解决方法
具体情况:之前在学校是通过有线网上网,VMware中的系统打开就可以直接连上网,现在回家图方便是通过无线路由器上网,发现虚拟机系统上不来网. 解决方法:控制面板->网络和Internet-> ...
- C语言学习012:将代码文件分成多个文件
如果将所有的代码都写到一个文件中,当对于小项目来说不会有什么问题,但是当它一个很大的工程的时候,如果将所有代码都写到一个文件中,不但开发起来很困难,维护更是头疼,所以我们应该将代码按不同的功能分别建立 ...
- asp.net各种cookie代码和解析
Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一.Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一 ...
- 精品干货丨APP常用导航框架
文章目的:在整体上把握移动端App的导航框架,理解每种导航所具有的优点.局限性和其所适用的范围. 文章用心:典型APP案例(源码:http://www.jinhusns.com/Products/Do ...
- 比对两个同类型的List
比对两个List中的数据 1 List<Person> ListA= new List<Person>() { "}, "}, "}, " ...
- MySQL使用二进制日志恢复数据库
一.二进制日志简介 MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复. 在my.ini文件中设置了log-bin, ...