关于刷新

当应用启动的时候,就会创建对应的主线程,我们的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,从而达到整体刷新的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值