当应用启动的时候,就会创建对应的主线程,我们的ui操作必须在主线程中执行,而主线程主要的也是用来进行ui操作的(所以也称主线程为 ui线程)。主线程应处于随时可能被响应的状态,超过5s没有响应请求,就会报ANR错误。
所以,当连接网络或者处理图片等耗时操作的时候,我们就会重新启动新的线程去处理,但新的线程又不能进行ui操作,android采用一种的Message Queue机制保证线程间的异步通信。
Message Queue是一个消息队列,用来存放通过Handler发送的消息。 Android在第一启动程序时会默认会为UI thread创建一个关联的消息队列, 可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,activities,broadcast receivers 等,你可以在自己的子线程中创建Handler与UI thread通讯。
Handler会向message queue通过两种方法发送消息:send或post。这两种消息都会插在message queue队尾并按先进先出执行,但通过这两种方法发送的消息执行的方式略有不同:
1)通过send发送的是一个message对象, 会被handler的 handleMessage()函数处理;
2)而通过post方法发送的是一个runnable对象,则会自己执行。
刷新View:
1.在handler中刷新(一般是结合非ui线程使用):
invalidate() 把之前的view去掉而重新绘制。与postinvalidate()的区别就是是在ui线程中调用,而不是在非ui线程中调用吧。
2.在非ui线程中刷新:
postinvalidate();
3.AsyncTask:
它的onpostexecute()也是在ui线程中运行的,可以对ui线程进行操作,而它的doinbackground()方法是运行在非ui线程中的,可以进行耗时的操作。
4.ListView的刷新:
notifyDataSetChanged(),调用时 会在getview()中调用invalidate()方法刷新item,从而达到整体刷新的效果。