Android中invalidate()和postInvalidate()的区别及使
⽤⽅法
Android中实现view的更新有两组⽅法,⼀组是invalidate,另⼀组是postInvalidate,其中前者是在UI线程⾃⾝中使⽤,⽽后者在⾮UI线程中使⽤。
Android提供了Invalidate⽅法实现界⾯刷新,但是Invalidate不能直接在线程中调⽤,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调⽤。
invalidate()是⽤来刷新View的,必须是在UI线程中进⾏⼯作。⽐如在修改某个view的显⽰时,调⽤invalidate()才能看到重新绘制的界⾯。invalidate()的调⽤是把之前的旧的view从主UI线程队列中pop掉。⼀个Android 程序默认情况下也只有⼀个进程,但⼀个进程下却可以有许多个线程。
在这么多线程当中,把主要是负责控制UI界⾯的显⽰、更新和控件交互的线程称为UI线程,由于onCreate()⽅法是由UI线程执⾏的,所以也可以把UI线程理解为主线程。其余的线程可以理解为⼯作者线程。
invalidate()得在UI线程中被调动,在⼯作者线程中可以通过Handler来通知UI线程进⾏界⾯更新;⽽postInvalidate()在⼯作者线程中被调⽤。
利⽤invalidate()刷新界⾯
实例化⼀个Handler对象,并重写handleMessage⽅法调⽤invalidate()实现界⾯刷新;⽽在线程中通过sendMessage发送界⾯更新消息。
// 在onCreate()中开启线程
new Thread( new GameThread()).start();、
// 实例化⼀个handler
Handler myHandler = new Handler() {
// 接收到消息后处理
public void handleMessage(Message msg) {
switch (msg.what) {
case Activity01.REFRESH:
mGameView.invalidate(); // 刷新界⾯
break ;
}
super .handleMessage(msg);
}
};
class GameThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
Message message = new Message();
message.what = Activity01.REFRESH;
// 发送消息
Activity01.this .myHandler.sendMessage(message);
try {
Thread.sleep(100 );
try catch的使用方法} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
// 在onCreate()中开启线程
new Thread(new GameThread()).start();、
/
/ 实例化⼀个handler
Handler myHandler = new Handler() {
// 接收到消息后处理
public void handleMessage(Message msg) {
switch (msg.what) {
case Activity01.REFRESH:
mGameView.invalidate(); // 刷新界⾯
break;
}
super.handleMessage(msg);
}
};
class GameThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
Message message = new Message();
message.what = Activity01.REFRESH;
// 发送消息
Handler.sendMessage(message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
使⽤postInvalidate()刷新界⾯
使⽤postInvalidate则⽐较简单,不需要handler,直接在线程中调⽤postInvalidate即可。
class GameThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(100 );
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 使⽤postInvalidate可以直接在线程中更新界⾯
mGameView.postInvalidate();
}
}
}
以上所述是⼩编给⼤家分享的Android中invalidate()和postInvalidate() 的区别及使⽤⽅法,希望对⼤家有所帮助!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论