Android-android handler
关于handler的理解问题,handler应该是运行在UI线程中的,可以接受子线程的数据来更新UI线程,但昨天看mars的视频关于handler那两讲的第二讲怎么说的是post里面的也是主线程啊,如果这样的话在post的线程里面操作耗时的任务时应该也会造成UI线程阻塞,那样的话就没什么意义了啊,理解的可能不对,希望谁对多线程这一块有研究的高手帮忙解答下,对这个东西很困惑.......
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Handler会关联一个单独的线程和消息队列。Handler默认关联主线程,虽然要提供Runnable参数 ,但默认是直接调用Runnable中的run()方法。也就是默认下会在主线程执行,如果在这里面的操作会有阻塞,界面也会卡住。如果要在其他线程执行,可以使用HandlerThread。
使用Handler的大致流程:
1、首先创建一个Handler对象,可以直接使用Handler无参构造函数创建Handler对象,也可以继承Handler类,重写handleMessage方法来创建Handler对象。
2、在监听器中,调用Handler的post方法,将要执行的线程对象添加到线程队列当中。此时将会把该线程对象添加到handler对象的线程队列中。
3、将要执行的操作写在线程对象的run方法中,一般是一个Runnable对象,复写其中的run方法就可以了。
Handler包含了两个队列,其中一个是线程队列,另外一个是消息队列。使用post方法会将线程对象放到该handler的线程队列中,使用sendMessage(Message message)将消息放到消息队列中。
如果想要这个流程一直执行的话,可以在run方法内部执行postDelayed或者post方法,再将该线程对象添加到消息队列中,重复执行。想要线程停止执行,调用Handler对象的removeCallbacks(Runnable r) 方法从线程队列中移除线程对象,使线程停止执行。
Handler为Android 提供了一种异步消息处理机制,当向消息队列中发送消息(sendMessage)后就立即返回,而从消息队列中读取消息时会阻塞,其中从消息队列中读取消息时会执行Handler中的public void handleMessage(Message msg) 方法,因此在创建Handler时应该使用匿名内部类重写该方法,在该方法中写上读取到消息后的操作,使用Handler的obtainMessage() 来获得消息对象。http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1024/467.html
只要主线程和UI线程不是同一个线程,就不会互相有影响。所以,只要post里面的线程和UI线程不是同一个线程,就不会造成UI线程阻塞。
而且,handler也不一定是运行在UI线程的。比如对于surfaceView类,进行绘图的UI线程是位于一个子线程,而handler线程可能位于主线程。
handler存在的主要目的,是为了方便多线程中各个不同的子线程之间的通信。当一个线程执行到一定程度,需要其他的线程合作的时候,只需要调用handler发送一个消息就OK了。一般来说,handler位于主线程,而通知handler发送消息的是子线程。
由于handler传递消息的方便性,所以有时候我也会把handler用于同一个线程不同View之间的通信上面,会方便许多。