HandlerThread深入理解
来源:互联网 发布:精易论坛淘宝采集 编辑:程序博客网 时间:2024/05/22 11:56
HandlerThread是Android API提供的一个便捷的类,他和普通线程的区别在于当我们启动它时会自动创建一个Looper实例。主要用来处理一些耗时为ms级别的任务。
1.下面我们通过api去理解,这样会更清晰:
首先我们用普通的Thread来创建一个Handler,实现过程如下:
Handler mHandler; new Thread() { @Override public void run() { super.run(); Looper.prepare(); mHandler = new Handler(Looper.myLooper()); Looper.loop(); } }.start();
注:实现很简单,在目标线程内如下配置:
1.调用Looper.prepare 创建与当前线程绑定的Looper实例
2.使用上面创建的Looper生成Handler实例
3.调用Looper.loop()实现消息循环
接下来我们看一下HandlerThread的内部实现:
@Overridepublic void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1;}
通过上面的代码可以清晰的看到HandlerThread执行run方法的时候初始化了一个Looper实例。,对于普通线程来说需要我们自己去实现。
2HandlerThread使用
private Handler mHandler;private LightTaskManager() { HandlerThread workerThread = new HandlerThread("LightTaskThread"); workerThread.start(); mHandler = new Handler(workerThread.getLooper());}
注:上面的 workerThread.start(); 必须要执行。
3控制优先级
a.HandlerThread的默认优先级是 Process.THREAD_PRIORITY_DEFAULT ,具体值为0。线程的优先级的取值范围为-20到19。优先级高的获得的CPU资源更多,反之则越少。-20代表优先级最高,19最低。0位于中间位置,但是作为工作线程的HandlerThread没有必要设置这么高的优先级,因而需要我们降低其优先级。
可控制的优先级:
以上的这些优先级都是可以在程序中设置的,除此之外还有不可控的优先级均有系统进行自动调整。
b.如何修改优先级:
最通用的就是在run方法中,加入合理的设置优先级代码,比如
Runnable run = new Runnable() { @Override public void run() { android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); }};
除此之外,HandlerThread的构造方法也提供了设置优先级的功能。用法如下:
HandlerThread workerThread = new HandlerThread("LightTaskThread", Process.THREAD_PRIORITY_BACKGROUND);
系统的AsyncTask已经开始进行了默认设置,将线程的优先级设置成THREAD_PRIORITY_BACKGROUND了。
public AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked Result result = doInBackground(mParams); Binder.flushPendingCommands(); return postResult(result); } };}
4应用场景
我们可以使用HandlerThread处理本地IO读写操作(数据库,文件),因为本地IO操作大多数的耗时属于毫秒级别,对于单线程 + 异步队列的形式 不会产生较大的阻塞。因此在这个HandlerThread中不适合加入网络IO操作。
对于本地IO读取操作,我们可以使用postAtFrontOfQueue方法,快速将读取操作加入队列前端执行,必要时返回给主线程更新UI。示例场景,从数据库中读取数据展现在ListView中。注意读取也是需要花费一定时间,推荐在数据展示之前有必要的用户可感知进度提示。
对于本地IO写操作,根据具体情况,选择post或者postDelayed方法执行。比如SharedPreference commit,或者文件写入操作。
5怎么区分某个Handler是工作线程的Handler还是主线程的Handler
很简单你是在那个线程创建的就是那个线程的Handler。
注1:在应用中既有工作线程的Handler,又有主线程的Handler,这种情况下要注意发消息和处理消息的Handler一定是同一个对象。当然也可以在主线程中用工作线程的Handler来发消息,在工作线程中同样也可以用主线程对的Handler来发送消息。
注2:对于该Handler.post(Runnable run)方法要注意如果是主线程的Handler该任务一定是加入主线程任务队列,由主线程来完成,在此Runnable的run方法中不可做耗时的操作。如果是工作线程的Handler该任务一定是加入工作线程任务队列,由工作线程来完成,在此Runnable的run方法中不可做更新UI的操作。
- 深入理解HandlerThread
- HandlerThread深入理解
- 深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系
- 深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系
- 深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系
- HandlerThread的一些理解
- HandlerThread使用个人理解
- Android入门:深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系
- Android入门:深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系
- Android入门:深入学习理解 Handler HandlerThread AsyncQueryHandler 三者的关系 收藏
- Android 源码系列之<七>从源码的角度深入理解IntentService及HandlerThread
- 对Handler,Looper,messagequeue,HandlerThread的深入理解,Handler常见面试题
- Android中的HandlerThread的理解
- 谈谈对HandlerThread的理解
- HandlerThread
- HandlerThread
- HandlerThread
- HandlerThread
- Echarts 经验
- 如何修改Android APP的图标和名字
- Sqoop2-2:There are issues with entered data, please revise your input:
- php 读取TXT文本生成 想要的数据格式
- 【VS开发】【miscellaneous】 Windows下配置Git
- HandlerThread深入理解
- Android Studio设置注释模板
- xml可以分页案例
- [C/C++11]_[初级]_[std::bind介绍和使用]
- centos命令
- Linux下察看swap分区大小及增加分区大小
- win7下的Django学习
- MySQL 存储引擎
- Codeforces Round #392(Div. 2) B Blown Garland【暴力枚举】