Handler机制的简单原理

来源:互联网 发布:人工智能教学百度云 编辑:程序博客网 时间:2024/05/21 12:50

说起handler相信大家都不陌生但是真正解释起来不是那么简单的  平时面试中常见问题还会经常遇到,我们基本上都是似懂非懂的去面对

大体上来说handler经常在开发中遇到的就是耗时操作之类的一些问题,还有就是解决线程之间的问题。

在UI线程

handler对象首先在主界面中进行声明,并覆盖其中的handleMessage(msg)方法。该方法用来接收子线程传递来的Message对象。


在子线程:

子线程启动后,首先创建Message对象。然后将待发送的数据放入Message对象中,并使用handler的sendMessage(msg)来发送msg对象,发送成功够,handleMessage(msg)拿到msg对象,并用这个msg对象里面的数据 来在主线程中更新手机界面。


因为android UI界面不是线程安全的,不允许子线程更新主UI线程,为了达到主界面的更新操作,此时便有了Handler对象.

Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。Android利用Handler来实现UI线程的更新的。

HandlerAndroid中的消息发送器,其在哪个Activity中创建就属于且紧紧属于该Activity。还可以说其在哪个线程中new的,就是那个线程的Handler


Handler特点 :

 

handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程), 

它有两个作用:

(1)安排消息或Runnable在某个主线程中某个地方执行

(2)安排一个动作在不同的线程中执行 


Handler中分发消息的一些方法 

post(Runnable) 

postAtTime(Runnable,long) 

postDelayed(Runnable long) 

sendEmptyMessage(int) 

sendMessage(Message) 

sendMessageAtTime(Message,long) 

sendMessageDelayed(Message,long) 

sendMessage类方法,允许你安排一个带数据的Message对象到队列中,等待更新.


把这些必备的方法搞明白基本上也就再注意一些细节,handeler就搞明白了。


最后再总结一下几点:

1、向哪个Handler发送消息,就必须在哪个handler里面接收;

2、直接使用JAVA Thread是无法更新Android UI的,因为Android View在设计的时线程是不完全的,不过Android提供了几种供开发者在线程中更新UI的方法,如下:

runOnUiThread( Runnable )

post( Runnable )

postDelayed( Runnable, long )

3、直接使用hanlder.post等方法是在当前主线程里面做操作,而不是另外新建线程,建议使用Thread线程直接新建另外一个线程或者使用HandlerThread类也可以。(这句话的意思是ui线程是主线程,把一些耗时的操作放入其他线程做,主线程仅仅更新视图)

4、记住消息队列的先进先出原则。 


这些可能不全面,后续再做补充!!!









原创粉丝点击