转载自:http://www.cnblogs.com/xingmeng/archive/2012/06/01/2530368.html
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
利用invalidate()刷新界面
实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。
// 在onCreate()中开启线程
new Thread(new GameThread()).start();、
<span style="font-size: 12px; white-space: pre;"> </span>// 实例化一个handler
<span style="font-size: 12px; white-space: pre;"> </span>Handler myHandler = new Handler() {
<span style="font-size: 12px; white-space: pre;"> </span>// 接收到消息后处理
<span style="font-size: 12px; white-space: pre;"> </span>public void handleMessage(Message msg) {
<span style="font-size: 12px; white-space: pre;"> </span>switch (msg.what) {
<span style="font-size: 12px; white-space: pre;"> </span>case Activity01.REFRESH:
<span style="font-size: 12px; white-space: pre;"> </span>mGameView.invalidate(); // 刷新界面
<span style="font-size: 12px; white-space: pre;"> </span>break;
<span style="font-size: 12px; white-space: pre;"> </span>}
<span style="font-size: 12px; white-space: pre;"> </span>super.handleMessage(msg);
<span style="font-size: 12px; white-space: pre;"> </span>}
};
class GameThread implements Runnable {
<span style="font-size: 12px; white-space: pre;"> </span>public void run() {
<span style="font-size: 12px; white-space: pre;"> </span>while (!Thread.currentThread().isInterrupted()) {
<span style="font-size: 12px; white-space: pre;"> </span>Message message = new Message();
<span style="font-size: 12px; white-space: pre;"> </span>message.what = Activity01.REFRESH;
<span style="font-size: 12px; white-space: pre;"> </span>// 发送消息
<span style="font-size: 12px; white-space: pre;"> </span>Activity01.this.myHandler.sendMessage(message);
<span style="font-size: 12px; white-space: pre;"> </span>try {
<span style="font-size: 12px; white-space: pre;"> </span>Thread.sleep(100);
<span style="font-size: 12px; white-space: pre;"> </span>} catch (InterruptedException e) {
<span style="font-size: 12px; white-space: pre;"> </span>Thread.currentThread().interrupt();
<span style="font-size: 12px; white-space: pre;"> </span>}
<span style="font-size: 12px; white-space: pre;"> </span>}
<span style="font-size: 12px; white-space: pre;"> </span>}
}
<pre name="code" class="html" style="line-height: 19.5px;"><strong><span style="font-size: 18px;">使用postInvalidate()刷新界面</span></strong>
<span> </span>//使用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();
}
}}