Picasso 源碼分析:Dispatcher

Dispatcher

總體概覽

Paste_Image.png

Dispatcher是什么?

名字:

從名字來(lái)看:分發(fā)者。

方法

從其dispatch開(kāi)頭的方法來(lái)看:

   void dispatchSubmit(Action action) {
        handler.sendMessage(handler.obtainMessage(REQUEST_SUBMIT, action));
    }

    void dispatchCancel(Action action) {
        handler.sendMessage(handler.obtainMessage(REQUEST_CANCEL, action));
    }

    void dispatchPauseTag(Object tag) {
        handler.sendMessage(handler.obtainMessage(TAG_PAUSE, tag));
    }

    void dispatchResumeTag(Object tag) {
        handler.sendMessage(handler.obtainMessage(TAG_RESUME, tag));
    }

    void dispatchComplete(BitmapHunter hunter) {
        handler.sendMessage(handler.obtainMessage(HUNTER_COMPLETE, hunter));
    }

    void dispatchRetry(BitmapHunter hunter) {
        handler.sendMessageDelayed(handler.obtainMessage(HUNTER_RETRY, hunter), RETRY_DELAY);
    }

    void dispatchFailed(BitmapHunter hunter) {
        handler.sendMessage(handler.obtainMessage(HUNTER_DECODE_FAILED, hunter));
    }

    void dispatchNetworkStateChange(NetworkInfo info) {
        handler.sendMessage(handler.obtainMessage(NETWORK_STATE_CHANGE, info));
    }

    void dispatchAirplaneModeChange(boolean airplaneMode) {
        handler.sendMessage(handler.obtainMessage(AIRPLANE_MODE_CHANGE,
                airplaneMode ? AIRPLANE_MODE_ON : AIRPLANE_MODE_OFF, 0));
    }

dispatch相關(guān)的方法負(fù)責(zé)分發(fā)對(duì)象。

這些對(duì)象通過(guò)handler來(lái)具體的分發(fā)消息。

handler由dispatcher持有。在其構(gòu)造方法中構(gòu)建:

Paste_Image.png

這個(gè)handler是 一個(gè)后臺(tái)線(xiàn)程(DispatcherThread)的 handler:

DispatcherThread

這個(gè)線(xiàn)程是擁有Looper的線(xiàn)程,可以通過(guò)handler進(jìn)行消息的收發(fā),進(jìn)行消息隊(duì)列的處理。
DispatcherThread---->HandlerThread--->Thread


Paste_Image.png

我們?cè)賮?lái)看下,DispatcherHandler對(duì)消息的處理:

private static class DispatcherHandler extends Handler {
        private final Dispatcher dispatcher;

        public DispatcherHandler(Looper looper, Dispatcher dispatcher) {
            super(looper);
            this.dispatcher = dispatcher;
        }

        @Override
        public void handleMessage(final Message msg) {
            switch (msg.what) {
                case REQUEST_SUBMIT: {
                    Action action = (Action) msg.obj;
                    dispatcher.performSubmit(action);
                    break;
                }
                case REQUEST_CANCEL: {
                    Action action = (Action) msg.obj;
                    dispatcher.performCancel(action);
                    break;
                }
                case TAG_PAUSE: {
                    Object tag = msg.obj;
                    dispatcher.performPauseTag(tag);
                    break;
                }
                case TAG_RESUME: {
                    Object tag = msg.obj;
                    dispatcher.performResumeTag(tag);
                    break;
                }
                case HUNTER_COMPLETE: {
                    BitmapHunter hunter = (BitmapHunter) msg.obj;
                    dispatcher.performComplete(hunter);
                    break;
                }
                case HUNTER_RETRY: {
                    BitmapHunter hunter = (BitmapHunter) msg.obj;
                    dispatcher.performRetry(hunter);
                    break;
                }
                case HUNTER_DECODE_FAILED: {
                    BitmapHunter hunter = (BitmapHunter) msg.obj;
                    dispatcher.performError(hunter, false);
                    break;
                }
                case HUNTER_DELAY_NEXT_BATCH: {
                    dispatcher.performBatchComplete();
                    break;
                }
                case NETWORK_STATE_CHANGE: {
                    NetworkInfo info = (NetworkInfo) msg.obj;
                    dispatcher.performNetworkStateChange(info);
                    break;
                }
                case AIRPLANE_MODE_CHANGE: {
                    dispatcher.performAirplaneModeChange(msg.arg1 == AIRPLANE_MODE_ON);
                    break;
                }
                default:
                    Picasso.HANDLER.post(new Runnable() {
                        @Override
                        public void run() {
                            throw new AssertionError("Unknown handler message received: " + msg.what);
                        }
                    });
            }
        }
    }

注意,對(duì)消息的處理,都是調(diào)用dispatcher中的 perform開(kāi)頭的方法!

簡(jiǎn)單的流程圖,如下:

Paste_Image.png

dispatcher方法全貌:

Paste_Image.png

深入一個(gè)具體的執(zhí)行流程

Paste_Image.png

關(guān)鍵點(diǎn):BitmapHunter依據(jù)action去搜尋bitmap。(這個(gè)會(huì)單獨(dú)一篇文章分析。)

這一堆任務(wù)來(lái)了,怎么管理?

用集合來(lái)記錄這一堆任務(wù)

Paste_Image.png

在執(zhí)行任務(wù),暫停任務(wù),恢復(fù)任務(wù),取消任務(wù)的相關(guān)操作也主要是對(duì)這些集合的操作。
下面大概說(shuō)一下:

  1. 暫停任務(wù):
Paste_Image.png
  1. 恢復(fù)任務(wù):
Paste_Image.png

在Picasso中執(zhí)行到:

Paste_Image.png

最終被執(zhí)行:

Paste_Image.png
最后編輯于
?著作權(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)容

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