溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android利用Handler異步獲取子線程中的產(chǎn)生的值

發(fā)布時(shí)間:2020-04-05 18:47:28 來(lái)源:網(wǎng)絡(luò) 閱讀:258 作者:ekind8 欄目:移動(dòng)開(kāi)發(fā)

    本文首發(fā)于cartoon的博客
    轉(zhuǎn)載請(qǐng)注明出處:https://cartoonyu.github.io/cartoon-blog

    近段時(shí)間有一個(gè)需求:在線獲取圖片并且顯示在界面上。因?yàn)樵诰€獲取圖片必定會(huì)有延遲,如果在主線程中獲取會(huì)有很大幾率造成主線程阻塞。解決的辦法是開(kāi)辟子線程進(jìn)行網(wǎng)絡(luò)訪問(wèn)。新的問(wèn)題又出現(xiàn)了:android的UI更新必須在主線程中完成。但是子線程的值脫離線程會(huì)無(wú)效,造成java.lang.NullPointerException。所以思考了一下決定用android自帶的異步處理機(jī)制:Handler,進(jìn)行消息的回調(diào)。

  1. 線程的開(kāi)辟。
private void downloadImage() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                final Bitmap bitmap= ServerImage.downloadFile();     //在線獲取圖片
                Looper.prepare();
                Message message=new Message();
                message.what=0;
                message.obj=bitmap;
                handler.sendMessage(message);
                Looper.loop();
            }
        }).start();

    }
  1. 自定義Handler。
class ImageHandler extends Handler{
        @Override
        public void handleMessage(Message msg){
            //編寫自定義邏輯
            switch (msg.what){
                case 0:{

                }
            }
        }
    }

         其中switch中的case與調(diào)用handler時(shí)定義的msg.what要嚴(yán)格一致。

  1. handler對(duì)象的定義

         定義的時(shí)候注意一點(diǎn):要在子線程外定義。

         我嘗試過(guò)在子線程內(nèi)定義,結(jié)果在把handler里面得到的圖片賦值給UI組件時(shí)發(fā)生java.lang.NullPointerException。不清楚什么原因,但是確實(shí)挺有趣的,有時(shí)間會(huì)探求一下里面的原理。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI