Android提供了Invalidate方法實現界面刷新,但是Invalidate不能直接在線程中調用,因為他是違背了單線程模型:androidUI操作並不是線程安全的,並且這些操作必須在UI線程中調用。
invalidate()是用來刷新View的,必須是在UI線程中進行工作。在修改某個view的顯示時,調用invalidate()才能看到重新繪製的界面。invalidate()的調用是把之前的舊的view從主UI線程隊列中pop掉。一個Android 程序默認情況下也只有一個進程,但一個進程下卻可以有許多個線程。
在這麼多線程當中,把主要是負責控制UI界面的顯示、更新和控件交互的線程稱為UI線程,由於onCreate()方法是由UI線程執行的,所以也可以把UI線程理解為主線程。其餘的線程可以理解為工作者線程。
invalidate()得在UI線程中被調動,在工作者線程中可以通過Handler來通知UI線程進行界面更新。
postInvalidate()在工作者線程中被調用
用invalidate()刷新界面
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
runOnUiThread(new Runnable() {
@Override
public void run() {
mRootView.invalidate(UPDATE_MODE_FULL_GC16);
}
});
}
}.start();
如果在 oncreate 直接呼叫是無法動作的
需用 Thread 去跑