前言
在android開(kāi)發(fā)中,界面UI的更新都是在主線程來(lái)完成的。線程分為主線程(Main Thread,簡(jiǎn)稱MT)和工作線程(Work Thread,簡(jiǎn)稱WT),我們通常會(huì)在WT中執(zhí)行一些比較耗時(shí)的操作,比如下載,網(wǎng)絡(luò),緩存等,然后在將結(jié)果發(fā)送給MT進(jìn)行UI的更新操作。如果是在WT進(jìn)行UI的更新,則會(huì)拋出異常,android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.(只有創(chuàng)建這個(gè)View的原始線程才能修改這個(gè)view)。
在BT搜索、WIFI搜索、其他需要更新View的UI過(guò)程中,很多是采用廣播的方式通知搜索的結(jié)果,實(shí)時(shí)的顯示到listview中進(jìn)行UI的更新操作。通常會(huì)使用以下幾種方式進(jìn)行UI的更新:handler,runOnUiThread,子線程發(fā)送Message。
一、Activity.runOnUiThread
利用Activity.runOnUiThread(Runnable)把更新ui的代碼創(chuàng)建在Runnable中,然后在需要更新 ui時(shí),把這個(gè)Runnable對(duì)象傳給Activity.runOnUiThread(Runnable)。這樣Runnable對(duì)像就能在ui程序中被調(diào)用。如果當(dāng)前線程是UI線程,那么行動(dòng)是立即執(zhí)行。如果當(dāng)前線程不是UI線程,操作是發(fā)布到事件隊(duì)列的UI線程。
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "開(kāi)始添加設(shè)備!");
addDevice(device);
}
});
二、handler.post(Runnable)
handler.post(new Runnable() {
@Override
public void run() {
addDevice(device);
}
});
三、子線程發(fā)送Message
首先在需要執(zhí)行更新的位置添加以下代碼
new Thread(new Runnable() {
@Override
public void run() {
//Message msg = new Message();
//msg.what = 0x06;
//handler.sendMessage(msg);
handler.sendEmptyMessage(0x06);
}
}).start();
然后進(jìn)入handler下進(jìn)行處理
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0x06:
addDevice(device);
break;
default:
break;
}
super.handleMessage(msg);
}
};
以上三種方法都可以實(shí)現(xiàn)UI的更新,掌握哪種方式取決于代碼中的疊加度,不過(guò)個(gè)人推薦使用方法一