8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
Handler使用场景
将一个任务切换到Handler所在的线程去执行:
通常用作子线程更新UI、HandlerThread、IntentService
Android的UI不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,如果对UI控件的访问加上锁机制的话,有两个缺点:首先加上锁机制会让UI访问的逻辑变得复杂;其次锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行。基于这两个缺点,最简单且高效的方法就是采用单线程模型来处理UI操作,对于开发者来说也不是很麻烦,只是需要通过Handler切换一下UI访问的执行线程即可。
Handler使用流程
假设mainThread和workThread两个线程,现在要从workThread切换到mainThread中执行某个操作。确定任务需要在哪个线程中执行,则在这个线程中初始化Looper(线程和Looper的对应关系由ThreadLocal维护)。
要做的是,在mainThread中创建Looper:1Looper.prepare()
在mainThread创建Handler。要做的是:1Handler handler = new Handler()
启动消息循环:1Looper.loop()
在workThread线程中获取mainThread的Handler,并且发送消息:1
2
3
4handler.sendMessage...// 最终调用会调用sendMessageAtTime(msg,time)
或
handler.post...// post..最终调用也会调用sendMessageAtTime(msg,time)
//sendMessageAtTime..方法最终调用enqueueMessage(..)方法,其内部会指定msg.target = this,this就是指当前的handler,处理消息时用得到!!
轮询MessageQueue(这一步不需要我们写代码,是为了流程的完整性,将其列出):1
2loop()方法中执行:Message msg = queue.next(),
接着:msg.target.dispatchMessage(msg) //将消息发送给对应的Handler(msg.target就对应的Handler)
这时,就可以在mainThread中执行workThread发送过来的消息了,handler处理消息的方式有三种:1
2
3handler.post(...) //第一优先级:执行post所传递的Runnable参数.run()
new Handler(callback) //第二优先级:执行构造方法传来的callback匿名内部类handleMessage(msg)
handlerMessage(msg)//第三优先级:调用Handler的handlerMessage()方法
以上,只有第4步是写在workThread中的,其余代码都是在mainThread里的。handler.post()什么作用???补充:
Android中的UI线程是不需要创建Looper的,因为ActivityThread被创建的时候就会初始化Looper。
tu
Handler工作流程及原理
Handler的部分工作原理流程在上一节已经有所提到,而这部分主要从源代码的角度分析下Handler的原理及工作流程。
Handler知识点Handler与线程的关系
一个线程可以有多个Handler
Handler与Looper的关系
Looper与线程的关系
Looper与MessageQueue的关系
MessageQueue与线程的关系