Android提供了Invalidate方法實(shí)現(xiàn)界面刷新原探,但是Invalidate不能直接在線程中調(diào)用曲管,因?yàn)樗沁`背了單線程模型:androidUI操作並不是線程安全的因块,並且這些操作必須在UI線程中調(diào)用震贵。
invalidate()是用來刷新View的,必須是在UI線程中進(jìn)行工作郁惜。在修改某個(gè)view的顯示時(shí)友题,調(diào)用invalidate()才能看到重新繪製的界面辈挂。invalidate()的調(diào)用是把之前的舊的view從主UI線程隊(duì)列中pop掉温自。一個(gè)Android 程序默認(rèn)情況下也只有一個(gè)進(jìn)程忧设,但一個(gè)進(jìn)程下卻可以有許多個(gè)線程闹蒜。
在這麼多線程當(dāng)中橙喘,把主要是負(fù)責(zé)控制UI界面的顯示雁佳、更新和控件交互的線程稱為UI線程拿霉,由於onCreate()方法是由UI線程執(zhí)行的缸废,所以也可以把UI線程理解為主線程包蓝。其餘的線程可以理解為工作者線程。
invalidate()得在UI線程中被調(diào)動企量,在工作者線程中可以通過Handler來通知UI線程進(jìn)行界面更新测萎。
postInvalidate()在工作者線程中被調(diào)用
用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 去跑