Android多线程编程之HandlerThread学习篇(四)
2016-06-14 14:18
357 查看
Android多线程编程之HandlerThread学习篇(四)
一、介绍
之前学习了Handler、IntentService以及线程池等内容后,再来看HandlerThread,就显得相对比较简单了,HandlerThread其实就是一个线程,只不过是它可以直接使用Handler的线程。HandlerThread在内部创建了消息队列。下面简要举例说明一下如何使用HandlerThread:
mHandlerThread = new HandlerThread("jkYishon-HandlerThread"); mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()) { @Override public void handleMessage(Message msg) { //模拟耗时任务 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Log.v("mHandler", "handleMessage"); } }; mHandler.sendEmptyMessage(0);
二、工作原理
HandlerThread在初始化的时候只是初始化了线程的名称以及线程的优先级。而在启动这个线程时,最主要是看run方法中的所做的事情。public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
在run方法中初始化了Looper对象,并且也初始化了消息队列等。onLooperPrepared主要是在执行消息循环之前所需要做的一些事情。而在初始化Handler的时候会用HandlerThread的getLooper方法获取。
public Looper getLooper() { if (!isAlive()) { return null; } // If the thread has been started, wait until the looper has been created. synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; }
其中run方法中的同步代码块中的notifyAll和getLooper方法中同步代码块中的wait方法是为了m初始化Handler的时候传入的参数Looper保证mHandlerThread在run方法中以及初始化了Looper对象。因为一个是在HandlerThread线程中初始化,而获取Looper对象是在UI主线程中获取,就必须保持线程同步,因而在此采用了这样的方式。
当Handler发送消息的时候,会将消息传给消息队列,而在HandlerThread中的run方法中调用的Looper.loop()可以无限从消息队列中取消息,那么之后Handler处理消息。在handleMessage中执行的代码其实是在HandlerThread线程中执行的。
另外需要注意的是,因为HandlerThread中的run方法中会不断无限循环取消息,那么在没有消息的时候会阻塞线程的执行。所以在没有任务需要处理的时候,则需要调用quit()或quitSafty()方法退出。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories