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
1 package app.com.myapplication; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.HandlerThread; 7 import android.os.Looper; 8 import android.os.Message; 9 import android.widget.Toast; 10 11 /** 12 * Created by ${zyj} on 2016/2/15. 13 * 14 */ 15 public class HandlerThreadActivity extends Activity { 16 17 private HandlerThread handlerThread ; 18 private Handler handler; 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 24 // 1:创建一个HandlerThread,即创建了一个包含Looper的线程。 25 handlerThread = new HandlerThread("leochin.com"); 26 handlerThread.start(); //创建HandlerThread后一定要记得start() 27 28 //2:获取HandlerThread的Looper 29 Looper looper = handlerThread.getLooper(); 30 31 //3:创建Handler,通过Looper初始化 32 handler = new Handler(looper) { 33 34 @Override 35 public void handleMessage(Message msg) { 36 super.handleMessage(msg); 37 int what = msg.what; 38 Toast.makeText(HandlerThreadActivity.this, "hahah" + what , Toast.LENGTH_SHORT).show(); 39 } 40 }; 41 42 //通过以上三步我们就成功创建HandlerThread。通过handler发送消息,就会在子线程中执行。 43 //如果想让HandlerThread退出,则需要调用handlerThread.quit();。 44 45 //创建一个线程发送消息 46 new ChildThread().start(); 47 } 48 49 class ChildThread extends Thread { 50 @Override 51 public void run() { 52 super.run(); 53 try { 54 //在子线程中可以做一些耗时的工作 55 sleep( 1000 ); 56 Message message = handler.obtainMessage(); 57 message.what = 3 ; 58 handler.sendMessage(message); 59 }catch ( Exception e ){ 60 61 } 62 } 63 } 64 }
实例2
1 package app.com.myapplication; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.HandlerThread; 7 import android.os.Looper; 8 import android.os.Message; 9 import android.widget.Toast; 10 11 /** 12 * Created by ${zyj} on 2016/2/15. 13 * HandlerThread继承于Thread,所以它本质就是个Thread。 14 * 与普通Thread的差别就在于,主要的作用是建立了一个线程,并且创立了消息队列,有来自己的looper,可以让我们在自己的线程中分发和处理消息。 15 */ 16 public class HandlerThreadActivity2 extends Activity { 17 18 19 private MHandlerThread mHandlerThread ; 20 private Handler handler ; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 26 // 1:创建一个HandlerThread,即创建了一个包含Looper的线程。 27 mHandlerThread = new MHandlerThread( "thisName" ) ; 28 mHandlerThread.start(); //创建HandlerThread后一定要记得start() 29 30 //2:获取HandlerThread的Looper 31 Looper looper = mHandlerThread.getLooper(); 32 33 //3:创建Handler,通过Looper初始化 34 //特别要注意的是handler与谁相关,不是看handler写在什么位置,而是看handler的looper跟什么相关 35 handler = new Handler(looper) { 36 37 @Override 38 public void handleMessage(Message msg) { 39 super.handleMessage(msg); 40 int what = msg.what; 41 Toast.makeText(HandlerThreadActivity2.this, "hahah" + what , Toast.LENGTH_SHORT).show(); 42 } 43 }; 44 45 handler.sendEmptyMessage(2) ; 46 47 } 48 49 class MHandlerThread extends HandlerThread { 50 public MHandlerThread(String name) { 51 super(name); 52 } 53 } 54 }
注意:写 MHandlerThread 的时候,最好写上线程的优选级
1 class MHandlerThread extends HandlerThread { 2 public MHandlerThread(String name ) { 3 //设置程序的优先级(标准后台程序) 4 super(name , Process.THREAD_PRIORITY_BACKGROUND); 5 } 6 }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android线程优先级设置方法技巧
对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题, 比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了MultiThread来解决慢速I/O但是合理分配优先级对于并发编程来说十分重要。 Android在线程方面主要使用的是Java本身的Thread类,我们可以在Thread或Runnable接口中的run方法首句加入:Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);//设置线程优先级为后台 这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理。 相关的Thread优先级Android123就Android平台专有的定义罗列有以下几种: int THREAD_PRIORITY_AUDIO //标准音乐播放使用的线程优先级 int THREAD_PRIORITY_BACKGROUND //标准后台程序 int THREAD_PRIORITY_DEFAULT // 默认应用的优先级 int THREAD_PRIORITY_DISPLAY //标准显...
- 下一篇
RxJava 和 RxAndroid 一 (基础)
1、RxJava 项目地址 https://github.com/ReactiveX/RxJava 2、RxAndroid 项目地址 https://github.com/ReactiveX/RxAndroid 3、RxJava 和 RxAndroid 的关系 RxAndroid是RxJava的一个针对Android平台的扩展,主要用于 Android 开发 4、RxJava和EventBus的区别? https://www.zhihu.com/question/32179258/answer/54989242 5、RxAndroid的使用方法 compile 'io.reactivex:rxandroid:1.2.0' 6、如何查看RxAndroid最新版本? http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22rxandroid%22 7、RxAndroid具体使用方法 http://gank.io/post/560e15be2dca930e00da1083#toc_14 http://blog...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装Docker,最新的服务器搭配容器使用