Android-HandlerThread简单使用
2017-11-01 13:21
120 查看
HandlerThread简介
HandlerThread继承了Thread,它是一种可以使用Handler的Thread,它的实现就是在run()方法中通过Looper.prepare()创建消息队列,并通过Looper.loop()开启消息循环。这样在实际使用中就允许在HandlerThread中创建Handler了。由于HandlerThread的run()方法是一个无限循环,因此当明确不需要使用HandlerThread的时候可以通过Looper的quit()或quitSafely()来终止线程执行。
使用Handler
通常我们会在主线程中创建Handler,在子线程中调用handler.post(runnable)传递消息到主线程的消息队列中处理runnable的run方法.这样完成了子线程到主线的切换。在onCreate()方法中
mainHandler = new Handler();
然后在子线程中post
btn_post_to_main_thread.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { Log.d(TAG, "Thread id = " + Thread.currentThread().getId()); mainHandler.post(runnable); } }).start(); } });
runnable
private Runnable runnable = new Runnable() { @Override public void run() { Log.d(TAG, "Thread id = " + Thread.currentThread().getId()); } };
运行结果
HandlerThreadActivity: Thread id = 10383 HandlerThreadActivity: Thread id = 1
使用HandlerThread
先创建HandlerThread实例,在onCreate()方法中handlerThread = new HandlerThread("handlerThread"); handlerThread.start();
这样就开启了一个带Looper的子线程,因为HandlerThread是继承自Thread,它的run方法是这样定义的
public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
关于Looper原理,可以参考《Android开发艺术探索》中的消息机制,我的理解是:
Looper.prepare();创建Looper实例
Looper.loop();进入一个无限循环中,不断监听消息队列中是否有消息,有则把他取出来分发给handler的handlerMessage()中处理。
因为线程中需要有一个Looper,线程绑定的handler才可以发送消息到消息队列中,那么相应的线程才会得到处理。
然后就是利用handlerThread获取到Looper用来创建Handler实例
handler = new Handler(handlerThread.getLooper());
此时这个handler即使实在主线程中创建,但是它与子线程的Looper关联了,所以处理消息时候也会在子线程中处理的
btn_post_to_sub_thread.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.post(runnable); } });
运行结果:
HandlerThreadActivity: Thread id = 10382 HandlerThreadActivity: Thread id = 10382 HandlerThreadActivity: Thread id = 10382
可以知道是在子线程中处理的。
HandlerThread和Thread的区别
普通Thread主要用于在run()方法中执行一个耗时的任务HandlerThread内部创建消息队列,需要handler消息方式来通知HandlerThread去执行一个具体的任务。
相关文章推荐
- Android HandlerThread 使用介绍及简单解析
- Android Handler、Loop 的简单使用 和 HandlerThread 总结使用
- Android中LocationManager的简单使用,获取当前位置(转http://www.javaeye.com/topic/363950)
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- Android Google Map的简单使用(一)
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- Android中LocationManager的简单使用,获取当前位置
- Android Service使用方法--简单音乐播放实例
- 【Android笔记 三】Location获取地理位置信息(中)Criteria类的简单使用
- Android 之 下拉框(Spinner)的简单使用
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- android 中使用AsyncTask实现简单的异步编程
- Android Intent Filter简单使用
- android google map 自定义地图的图层 简单使用(二)
- Android中LocationManager的简单使用,获取当前位置
- APIDemo学习笔记——Android上几种简单的Animation使用方法(一)
- Android中LocationManager的简单使用,获取当前位置[转
- Android中简单配置读写,SharedPreferences的使用
- android 使用MideaPlayer API来播放简单的应用
- Android ListView的简单使用