誤區(qū)一:(線程阻塞)
private void button1_click() throws InterruptedException {
AlertDialog dialog = new AlertDialog.Builder(this)
.setMessage("加載中...")
.show();
Thread.sleep(5000);
button1.setText("加載完畢");
dialog.dismiss();
}
????????以上代碼铸屉,很多人描述看到的效果是:點擊按鈕后,彈出一個對話框切端,顯示“加載中...”,5秒后按鈕顯示文字變成了“加載完畢”彻坛,對話框消失。
????????但是以上描述是錯誤的踏枣,你根本看不到對話框昌屉,你會發(fā)現(xiàn)事實上是這樣的:點擊按鈕后,按鈕沒有抬起來茵瀑,5秒后间驮,按鈕抬起來了,同時按鈕文字變成了“加載完畢”瘾婿。
????????我們發(fā)現(xiàn)原來整個過程中蜻牢,AlertDialog毫無存在感烤咧,根本也看不到它出現(xiàn)偏陪,原因是因為抢呆,這里發(fā)生了UI線程阻塞。當要show出dialog的時候笛谦,下一句是Thread.sleep(5000)抱虐,這句話的意思是,當前的線程睡眠5秒饥脑,也就是UI線程恳邀,因為這句代碼沒有寫在子線程中,如果它寫在了子線程中灶轰,那么睡眠的就是子線程了谣沸,而非主線程。當睡眠完后笋颤,馬上修改按鈕的文字乳附,再讓dialog消失,dialog的整個顯示到消失伴澄,排除掉睡眠時間赋除,肉眼根本無法捕捉到。
????????如果我們真的要達到很多人描述的那種效果非凌,我們需要這樣修改(且不說代碼嵌套層次和優(yōu)化):
private void button1_click() throws InterruptedException {
AlertDialog dialog = new AlertDialog.Builder(this)
.setMessage("加載中...")
.show();
new Thread(new Runnable() {
@Override
public void run() {
Thread.sleep(5000);
runOnUiThread(new Runnable() {
@Override
public void run() {
button1.setText("加載完畢");
dialog.dismiss();
}
});
}
}).start();
}
誤區(qū)二:(cpu對線程的調(diào)度)
private void button1_click(View view) {
final AlertDialog dialog = new AlertDialog.Builder(this)
.setMessage("加載中...")
.show();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
runOnUiThread(new Runnable() {
@Override
public void run() {
button1.setText("加載完畢1");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
button1.postDelayed(new Runnable() {
@Override
public void run() {
button1.setText("加載完畢2");
dialog.dismiss();
}
},3000);
}
????????以上代碼举农,很多人描述看到的效果是:點擊按鈕后,彈出一個對話框敞嗡,顯示“加載中…”颁糟,5秒后,按鈕文字變成了“加載完畢1”喉悴,又停了3秒后棱貌,按鈕問題變成了“加載完畢2”,對話框消失粥惧。
????????同樣键畴,以上描述也是錯誤的。我們可以理解線程的開啟突雪,就是一個任務塊的開啟起惕,打開一個任務的開啟,并不需要花費cpu什么時間咏删,同樣的惹想,postDelayed也只是通知cpu,3秒后開啟一個任務督函,也是不需要花多少時間的嘀粱,至于具體去處理這些任務的時候激挪,那又是另一個層面的事情,不會影響當前的代碼執(zhí)行順序锋叨,也就是說垄分,整個代碼塊,我們可以理解為在UI線程中娃磺,只給cpu下達了三個命令:彈出一個對話框薄湿,開一個子線程執(zhí)行一個任務,3秒后執(zhí)行一個任務偷卧。
????????所以豺瘤,我們看到的效果應該是:點擊按鈕后,彈出一個對話框听诸,顯示“加載中…”坐求,3秒后,按鈕問題變成了“加載完畢2”晌梨,對話框消失桥嗤,又過了2秒后,按鈕文字變成了“加載完畢1”派任。