android中的HandlerThread类的学习
2016-03-07 22:34
381 查看
转载自:http://blog.csdn.net/cwx01perfect/article/details/7522923
Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误。
Android中专门提供了HandlerThread类,来解决该类问题。HandlerThread类是一个线程专门处理Hanlder的消息,依次从Handler的队列中获取信息,逐个进行处理,保证安全,不会出现混乱引发的异常。HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。
HandlerThread thread = newHandlerThread("handler_thread");
thread.start();
final Handlerhandler = newHandler(thread.getLooper()){
@Override
public voidhandleMessage(Message msg) {
Log.i("TAG", "thecurrent thread is"+Thread.currentThread());
super.handleMessage(msg);
}
};
new Thread(newRunnable(){
@Override
public void run() {
// TODOAuto-generated method stub
for(int i = 0;i<10;i++){
handler.sendMessage(Message.obtain());
try {
Thread.sleep(500);
}catch(InterruptedException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
}
}).start()
注:Handler 与谁相关联不是看声明在什么地方,是看与哪个线程的looper挂钩。默认是主线程的looper.因为主线程中默认就有了looper,消息循环队列。
Android SDK中的方法说明:
//用于返回与该线程相关联的Looper对象
publicLooper getLooper ()
//获得该线程的Id
publicint getThreadId ()
//结束当前的Looper 循环。
publicboolean quit ()
//用于looper取出的消息处理
publicvoid run ()
Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误。
Android中专门提供了HandlerThread类,来解决该类问题。HandlerThread类是一个线程专门处理Hanlder的消息,依次从Handler的队列中获取信息,逐个进行处理,保证安全,不会出现混乱引发的异常。HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。
HandlerThread thread = newHandlerThread("handler_thread");
thread.start();
final Handlerhandler = newHandler(thread.getLooper()){
@Override
public voidhandleMessage(Message msg) {
Log.i("TAG", "thecurrent thread is"+Thread.currentThread());
super.handleMessage(msg);
}
};
new Thread(newRunnable(){
@Override
public void run() {
// TODOAuto-generated method stub
for(int i = 0;i<10;i++){
handler.sendMessage(Message.obtain());
try {
Thread.sleep(500);
}catch(InterruptedException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
}
}).start()
注:Handler 与谁相关联不是看声明在什么地方,是看与哪个线程的looper挂钩。默认是主线程的looper.因为主线程中默认就有了looper,消息循环队列。
Android SDK中的方法说明:
//用于返回与该线程相关联的Looper对象
publicLooper getLooper ()
//获得该线程的Id
publicint getThreadId ()
//结束当前的Looper 循环。
publicboolean quit ()
//用于looper取出的消息处理
publicvoid run ()
相关文章推荐
- android6.0新特性——电源节能
- android 属性动画 vs 延时实现动画
- 一个将Android手机屏幕投影到电脑屏幕上的软件
- android 开源项目地址汇总
- Android开发之使用本地广播
- Android多点触控技术实战,自由地对图片进行缩放和移动
- Android瀑布流照片墙实现,体验不规则排列的美感
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android中ArrayAdapt&SimpleAdapt的使用
- Android 之 日期选择器
- Android 热修复Nuwa的原理及Gradle插件源码解析
- #Android学习#NavigationView基础
- Android开发涉及到的英文
- android完全退出程序
- Android学习笔记18:自定义Seekbar拖动条式样
- Android照片墙应用实现,再多的图片也不怕崩溃
- Android JNI编程规范
- android中JNI调用时内存分布以及内存泄露原因分析
- android之bitmap-xml文件属性详解
- Fresco介绍 - 超级牛逼的android图片加载库