Android UI更新的幾種方法

前言


在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è)人推薦使用方法一

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,007評(píng)論 25 709
  • 作為IT新手,總以為只要有時(shí)間,有精力,什么東西都能做出來(lái)。這種念頭我也有過(guò),但很快就熄滅了,因?yàn)楝F(xiàn)實(shí)是殘酷的,就...
    AiPuff閱讀 944評(píng)論 0 0
  • 接近黃昏,太陽(yáng)懶懶的從西方發(fā)出柔和的光??Х鹊昀锶寺_(kāi)始多起來(lái),大部分人幾個(gè)一桌,低聲地談笑著。 我看著那個(gè)女人...
    不覚閱讀 601評(píng)論 4 6
  • A1通過(guò)矛盾來(lái)得到洞察 今天上午公司例行會(huì)議中,商品部與市場(chǎng)部因發(fā)貨問(wèn)題而起沖突。事情起因,我管轄區(qū)域門(mén)店在上周要...
    visllen閱讀 205評(píng)論 0 0
  • 這個(gè)世界不允許有靈魂的人 ――袁雪芬 -1- “爸,您說(shuō)會(huì)回來(lái)的,怎么一去好幾年,到現(xiàn)在連音訊都沒(méi)有,您在異鄉(xiāng)客...
    姑娘簡(jiǎn)一閱讀 1,565評(píng)論 5 13

友情鏈接更多精彩內(nèi)容