最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android后臺(tái)線程和UI線程通訊實(shí)例

 更新時(shí)間:2014年06月26日 09:05:36   作者:冰凍魚(yú)  
這篇文章主要介紹了Android后臺(tái)線程和UI線程通訊實(shí)例,每一步的要點(diǎn)和步驟都有提及,并配有代碼例子,需要的朋友可以參考下

本節(jié)向你展示如何在任務(wù)中發(fā)送數(shù)據(jù)給UI線程里的對(duì)象,這個(gè)特性允許你在后臺(tái)線程工作,完了在UI線程展示結(jié)果。

在UI線程定義一個(gè)Handler

Handler是Android系統(tǒng)線程管理框架里的一部分。一個(gè)Handler對(duì)象接收消息,并且運(yùn)行代碼來(lái)處理消息。正常情況下,你為新線程創(chuàng)建Handler,但你也可以為已有的線程創(chuàng)建一個(gè)Handler.當(dāng)你連接Handler到UI線程時(shí),處理消息的代碼會(huì)在UI線程上運(yùn)行.

在創(chuàng)建線程池的類的構(gòu)造器里實(shí)例化Handler對(duì)象,保存在全局變量里。用Handler(Looper)方法實(shí)例化,連接到UI線程,構(gòu)造方法使用Looper對(duì)象,也是Android系統(tǒng)線程管理框架里的一部分.Looper類有一個(gè)靜態(tài)方法getMainLooper()可以獲取UI線程的Looper對(duì)象。如:

復(fù)制代碼 代碼如下:

private PhotoManager() {
...
    // Defines a Handler object that's attached to the UI thread
    mHandler = new Handler(Looper.getMainLooper()) {
    ...

在Handler里,覆蓋handleMessage()。Android系統(tǒng)會(huì)在Handler管理的線程收到新消息時(shí),調(diào)用該方法。一個(gè)指定線程的所有Handler對(duì)象都會(huì)收到相同的消息。

復(fù)制代碼 代碼如下:

        /*
         * handleMessage() defines the operations to perform when
         * the Handler receives a new Message to process.
         */
        @Override
        public void handleMessage(Message inputMessage) {
            // Gets the image task from the incoming Message object.
            PhotoTask photoTask = (PhotoTask) inputMessage.obj;
            ...
        }
    ...
    }
}

從任務(wù)里移動(dòng)數(shù)據(jù)到UI線程

要從后臺(tái)線程的任務(wù)里移動(dòng)數(shù)據(jù)到UI線程的對(duì)象,先保存引用到數(shù)據(jù)和任務(wù)對(duì)象的UI對(duì)象里,接下來(lái)把任務(wù)對(duì)象和狀態(tài)碼傳給Handler對(duì)象。在這個(gè)對(duì)象里,發(fā)送一個(gè)包含狀態(tài) 和任務(wù)對(duì)象的消息給Handler.因?yàn)镠andler在UI線程上運(yùn)行,它可以移動(dòng)數(shù)據(jù)給UI對(duì)象。

在任務(wù)對(duì)象里存儲(chǔ)數(shù)據(jù)

如,這是一個(gè)Runnable,運(yùn)行在后臺(tái)線程,它解析Bitmap,并保存到它的父對(duì)象。Runnable同時(shí)保存狀態(tài)碼DECODE_STATE_COMPLETED。

復(fù)制代碼 代碼如下:

// A class that decodes photo files into Bitmaps
class PhotoDecodeRunnable implements Runnable {
    ...
    PhotoDecodeRunnable(PhotoTask downloadTask) {
        mPhotoTask = downloadTask;
    }
    ...
    // Gets the downloaded byte array
    byte[] imageBuffer = mPhotoTask.getByteBuffer();
    ...
    // Runs the code for this task
    public void run() {
        ...
        // Tries to decode the image buffer
        returnBitmap = BitmapFactory.decodeByteArray(
                imageBuffer,
                0,
                imageBuffer.length,
                bitmapOptions
        );
        ...
        // Sets the ImageView Bitmap
        mPhotoTask.setImage(returnBitmap);
        // Reports a status of "completed"
        mPhotoTask.handleDecodeState(DECODE_STATE_COMPLETED);
        ...
    }
    ...
}
...

PhotoTask還包含一個(gè)ImageView引用,用來(lái)顯示Bitmap.盡管引用Bitmap和ImageView是在同一個(gè)對(duì)象里,但因?yàn)椴皇窃赨I線程,你不能直接讓ImageView顯示Bitmap.

沿對(duì)象層次逐級(jí)發(fā)送狀態(tài)

PhotoTask持有解碼的數(shù)據(jù)和顯示數(shù)據(jù)的View對(duì)象的引用,它從PhotoDecodeRunnable接收到狀態(tài)碼,并且沿著線程池里引用的對(duì)象和Handler實(shí)例傳送。

復(fù)制代碼 代碼如下:

public class PhotoTask {
    ...
    // Gets a handle to the object that creates the thread pools
    sPhotoManager = PhotoManager.getInstance();
    ...
    public void handleDecodeState(int state) {
        int outState;
        // Converts the decode state to the overall state.
        switch(state) {
            case PhotoDecodeRunnable.DECODE_STATE_COMPLETED:
                outState = PhotoManager.TASK_COMPLETE;
                break;
            ...
        }
        ...
        // Calls the generalized state method
        handleState(outState);
    }
    ...
    // Passes the state to PhotoManager
    void handleState(int state) {
        /*
         * Passes a handle to this task and the
         * current state to the class that created
         * the thread pools
         */
        sPhotoManager.handleState(this, state);
    }
    ...
}

移動(dòng)數(shù)據(jù)到UI

PhotoManager從PhotoTask對(duì)象接收到狀態(tài)碼和PhotoTask對(duì)象的句柄。因?yàn)闋顟B(tài)是TASK_COMPLETE,創(chuàng)建一個(gè)包含狀態(tài)和任務(wù)對(duì)象的Message,發(fā)送給Handler。

復(fù)制代碼 代碼如下:

public class PhotoManager {
    ...
    // Handle status messages from tasks
    public void handleState(PhotoTask photoTask, int state) {
        switch (state) {
            ...
            // The task finished downloading and decoding the image
            case TASK_COMPLETE:
                /*
                 * Creates a message for the Handler
                 * with the state and the task object
                 */
                Message completeMessage =
                        mHandler.obtainMessage(state, photoTask);
                completeMessage.sendToTarget();
                break;
            ...
        }
        ...
    }

最終,Handler.handleMessage()為每個(gè)進(jìn)來(lái)的Message檢查狀態(tài)碼。如果狀態(tài)碼是TASK_COMPLETE,任務(wù)就是完成了,Message里的PhotoTask對(duì)象包含Bitmap和ImageView.因?yàn)镠andler.handleMessage()運(yùn)行在UI線程,它可以安全地為ImageView設(shè)置Bitmap.

相關(guān)文章

  • Android Material加載進(jìn)度條制作代碼

    Android Material加載進(jìn)度條制作代碼

    這篇文章主要為大家詳細(xì)介紹了AndroidMaterial加載進(jìn)度條的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android?RecyclerView實(shí)現(xiàn)九宮格效果

    Android?RecyclerView實(shí)現(xiàn)九宮格效果

    這篇文章主要為大家詳細(xì)介紹了Android?RecyclerView實(shí)現(xiàn)九宮格效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 如何在Android App中集成支付寶和微信支付功能

    如何在Android App中集成支付寶和微信支付功能

    支付是各位Android開(kāi)發(fā)者們?cè)谌粘9ぷ髦薪?jīng)常會(huì)遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于如何在Android App中集成支付寶和微信支付功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Android開(kāi)發(fā)之MediaPlayer基本使用方法詳解

    Android開(kāi)發(fā)之MediaPlayer基本使用方法詳解

    這篇文章主要介紹了Android開(kāi)發(fā)之MediaPlayer基本使用方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了MediaPlayer中的常用函數(shù)與基本使用技巧,需要的朋友可以參考下
    2017-05-05
  • Android ListView 實(shí)例講解清晰易懂

    Android ListView 實(shí)例講解清晰易懂

    這篇文章主要通過(guò)實(shí)例介紹了Android ListView,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Android 10 啟動(dòng)分析之init語(yǔ)法詳解

    Android 10 啟動(dòng)分析之init語(yǔ)法詳解

    這篇文章主要為大家介紹了Android 10 啟動(dòng)分析之init語(yǔ)法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android多線程學(xué)習(xí)實(shí)例詳解

    Android多線程學(xué)習(xí)實(shí)例詳解

    這篇文章主要介紹了Android多線程,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android多線程的概念、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-10-10
  • Flutter?Widget之NavigationBar使用詳解

    Flutter?Widget之NavigationBar使用詳解

    這篇文章主要為大家介紹了Flutter?Widget之NavigationBar使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android Toolbar應(yīng)用欄使用方法簡(jiǎn)介

    Android Toolbar應(yīng)用欄使用方法簡(jiǎn)介

    App中應(yīng)用欄是十分常見(jiàn)的,通常應(yīng)用欄會(huì)顯示當(dāng)前頁(yè)面的標(biāo)題,還有一些操作按鈕,例如返回、搜索、掃碼等。本文介紹如何通過(guò)Toolbar實(shí)現(xiàn)應(yīng)用欄
    2022-12-12
  • Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng)

    Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng)

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

姚安县| 泸西县| 滦平县| 安远县| 万年县| 白银市| 开化县| 博湖县| 泰宁县| 绥阳县| 长白| 屯昌县| 新营市| 东至县| 柳州市| 宣汉县| 通渭县| 商南县| 长武县| 台南市| 瑞安市| 怀宁县| 宁都县| 肇州县| 承德县| 印江| 顺昌县| 德昌县| 日土县| 建宁县| 永泰县| 沐川县| 马关县| 镇宁| 合肥市| 高陵县| 陇西县| 东兰县| 昔阳县| 鄂州市| 临湘市|