一、前期基础知识储备
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视图。