国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
IntentService 源碼分析 - Android - 老翟的倉庫








在 小心,AsyncTask 不是萬能的 中,我提到 IntentService  是你在實(shí)現(xiàn)下載功能時(shí),最好用的武器之一。

這次,我們來深入研究 IntentService 的原始碼,看他是如何用短短幾行代碼,來解決這個(gè)問題。

public abstract class IntentService extends Service {

                   ...

}


從 class 的宣告中,你可以知道 IntentService 就是一般的 Service。

接著他定義一個(gè) ServiceHandler。一般我們在創(chuàng)建 Handler 時(shí),都是用預(yù)設(shè)的建構(gòu)式。預(yù)設(shè)的 Handler 建構(gòu)式,是依附在當(dāng)前的 thread 身上。所以一般開發(fā)者都以為 Handler 一定是依附在 main-thread 上,這是不對的觀念。

private final class ServiceHandler extends Handler {

        public ServiceHandler(Looper looper) {

            super(looper); 

        }

         ...

}


這個(gè) ServiceHandler,是依附在一個(gè) non-UI thread 的 Looper 上。Looper 就是訊息迴圈 (message loop),這是 Android UI 在處理各式訊息時(shí),最重要的元件之一。而 ServiceHandler 建構(gòu)式中所傳入的 Looper 物件,是在 onCreate() 中所建立的。

@Override

public void onCreate() {

      super.onCreate();

      HandlerThread thread = new HandlerThread("IntentService[" +  mName + "]");

      thread.start();

      mServiceLooper = thread.getLooper();

      mServiceHandler = new ServiceHandler(mServiceLooper);

}


看到了吧,mServiceLooper 就是 thread 物件中的 Looper 物件。這個(gè) thread 物件就是一個(gè) HandlerThread,他是一個(gè) non-UI thread。

所以現(xiàn)在這個(gè) Service,一個(gè)帶有 message loop(mServiceLooper) 的 non-UI thread (mServiceHandler) 正一直在背後執(zhí)行著,監(jiān)看是否有任何傳入的 message。

接著,每當(dāng)你呼叫 startService(new Intent(this, MyIntentService.class)) 啟動(dòng) IntentService 時(shí),其實(shí)他只是很簡單地送出一個(gè) message 到 mServiceHandler 上。

@Override

public void onStart(Intent intent, int startId) {

          Message msg = mServiceHandler.obtainMessage();

          msg.arg1 = startId;

          msg.obj = intent;

          mServiceHandler.sendMessage(msg);

}


我們知道這個(gè) message 最終會由 Handler.handleMessage() 來處理。由於整個(gè) mServiceHandler 是在 non-UI thread 中執(zhí)行。當(dāng)他在 handleMessage() 中呼叫你的 onHandleIntent() 時(shí),你的 onHandleIntent() 自然也是在 non-UI thread 中執(zhí)行。

private final class ServiceHandler extends Handler {

      ...

      @Override

      public void handleMessage(Message msg) {  

              onHandleIntent((Intent)msg.obj);

              stopSelf(msg.arg1);

       }

}


onHandleIntent() 執(zhí)行結(jié)束後,接著呼叫 stopSelf(int)。由於 IntentService 是設(shè)計(jì)用來可以在一個(gè) Service 中服務(wù)多項(xiàng)工作,因此在這裡,不可以呼叫 stopSelf()。

如果你呼叫 startService() 多次,每一次的呼叫都會被轉(zhuǎn)成一個(gè) message,並放在 mServiceLooper 的 message queue 中,等待被服務(wù)。一個(gè) message 所對應(yīng)的工作被完成後,才會繼續(xù)服務(wù)下一個(gè)工作。所以,這些等待被服務(wù)的工作,並不是一起並行 (Concurrent) 的,而是循序執(zhí)行。

當(dāng)所有的工作都處裡完時(shí),也是 Service 該結(jié)束的時(shí)候。

@Override

public void onDestroy() {

       mServiceLooper.quit();

}


在 onDestroy() 中,唯一要做的事,就是要將 mServiceLooper 停下來。

從研究這個(gè) IntentService 的原始碼,我們可以學(xué)到如何運(yùn)用簡單的 pattern (Service + Handler + HandlerThread),幫我們更簡易與有系統(tǒng)地,完成我們所想要做的事。

最後我們先前說過,在 IntentServcie 中等待被服務(wù)的工作,並不會被一起並行,而是循序執(zhí)行。如果你今天想要這些等待被服務(wù)的工作,能夠一起被並行,在研讀完這個(gè) IntentService 的原始碼後,你自己知不知道如何寫個(gè)可支援並行工作的 IntentService?

提示:可以用 Service + AsyncTask 的組合。








本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android Service學(xué)習(xí)之IntentService 深入分析
Android Service
深入剖析Android消息機(jī)制
Android中IntentService的使用及其源碼解析
Android IntentService詳解
[z]android?service?使用以及aidl使用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服