IntentService源碼分析

IntentService可用于執(zhí)行耗時的,高優(yōu)先級的后臺任務(wù),封裝了Handlerthread和Handler

源碼分析

oncreate():

第一次創(chuàng)建intentservice的時候,會執(zhí)行一次oncreate方法

 @Override
    public void onCreate() {
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

在oncreate方法里,會創(chuàng)建HandlerThread,這個類主要作用我們后邊說,先來看一下HandlerThread里面都做了哪些東西??主要是看它的run方法,HandlerThread類和一般的thread類區(qū)別就在于,它的run方法里面創(chuàng)建了looper。而且IntentService通過looper,創(chuàng)建了handler。這樣的話,intentservice通過handler發(fā)送消息,最后會在handlerthread中處理。

 @Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }
onStartCommand

intentservice會在onstartcommand中處理外界給的intent,會接著調(diào)用onstart方法

 @Override
    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

    /**
     * You should not override this method for your IntentService. Instead,
     * override {@link #onHandleIntent}, which the system calls when the IntentService
     * receives a start request.
     * @see android.app.Service#onStartCommand
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

這個可以看出來,非常簡單,只是通過handler發(fā)送了一條消息,會進(jìn)入handlerthread的looper,這時候又是涉及到了線程切換 。這塊怎么講呢???以前以為類在哪個線程創(chuàng)建,這個類以及這個類的方法,就屬于哪個線程,這個是極其錯誤的想法,應(yīng)該是這個類的方法,被哪個線程調(diào)用了,這個方法就屬于哪個線程。這么一看的話。

intentservice發(fā)送了消息,然后通過HandlerThread的looper進(jìn)入到HandlerThread線程,而這個線程里面的looper又會調(diào)用,handler的handlemessage,進(jìn)而調(diào)用onHandleIntent方法。這時候耗時任務(wù),就相當(dāng)于是在onHandleIntent類里面調(diào)用的。從而達(dá)到了切換線程的操作。



Android中的線程池

線程池的優(yōu)點:
(1)重用線程池里面的線程,避免創(chuàng)建和銷毀線程帶來的性能開銷
(2)能有效控制線程池的最大并發(fā)數(shù),避免大量線程之間因為互相搶占系統(tǒng)資源而導(dǎo)致阻塞
(3)能夠?qū)€程進(jìn)行簡單的管理,并提供定時執(zhí)行以及制定間隔循環(huán)執(zhí)行等功能

ThreadPoolExecutor

(1)線程池中線程數(shù)量未達(dá)到核心線程數(shù)量,就會直接啟動核心線程
(2)如果線程數(shù)量已經(jīng)或者超過核心線程數(shù)量,那么就會排隊等待
(3)如果沒辦法將任務(wù)插入到任務(wù)隊列,這時候未達(dá)到線程池該規(guī)定的最大值,那么就會啟動一個非核心線程
(4)如果線程數(shù)量達(dá)到線程池規(guī)定的最大值,那么就拒絕執(zhí)行此任務(wù)。

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

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

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