刷新View视图的两种方法—invalidate()和postInvalidate()的区别和使用详解

一、前期基础知识储备

Invalidate英文释义:刷新

上,官方文档:

由官方文档,我们可以知道,invalidate()和postInvalidate()方法都是用来刷新View界面/View视图的

1)区别:invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。 postInvalidate()直接可以在子线程中调用,可以直接刷新页面。

2)具体实现:①利用invalidate()方法刷新页面,要借用Handler类,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage()方法发送界面更新消息;②使用postInvalidate则比较简单,不需要Handler,直接在线程中调用postInvalidate即可。

感兴趣的读者可以参考笔者的 Android线程阻塞处理及优化》里面具体讲述了Handler实现线程间通信的具体机制。

二、上代码,具体实现invalidate()和postInvalidate()刷新页面

invalidate()方法刷新View视图

class DownloadThread extends Thread{

    @Override

    public void run() {

        try{

        Thread.sleep(5000);

        Message msg = new Message();

        msg.what = 1;

       / /将该Message发送给对应的Handler

        uiHandler.sendMessage(msg);//注意此时还是在支线程中

        }catch (InterruptedException e){

            e.printStackTrace();

    }

};

//uiHandler在主线程中创建,所以自动绑定主线程

private Handler uiHandler = new Handler(){

    Override

    public void handleMessage(Message msg) {

        switch (msg.what){
            case 1:
            mGameView.invalidate();// 刷新界面
            break;

        }

    }

};
postInvalidate()方法刷新页面
class DownloadThread extends Thread{

    @Override

    public void run() {

        try{

        Thread.sleep(5000);

        }catch (InterruptedException e){

            e.printStackTrace();
         mGameView.postInvalidate();// 刷新界面   
    }        
};
小结:实际上,两种方法的使用都比较简单。常见的应用场景,比如手机淘宝,打开一个宝贝详情页之后,不断往下拉,页面会不断加载,加载进来的看起来是图片,实际上是一个个View控件,你可以点击跳转的,这种场景就涉及到了刷新View视图。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值