Android技术知识Android开发Android开发经验谈

IntentService源码分析

2018-07-27  本文已影响12人  上官若枫

IntentService可用于执行耗时的,高优先级的后台任务,封装了Handlerthread和Handler

源码分析

oncreate():

第一次创建intentservice的时候,会执行一次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方法里,会创建HandlerThread,这个类主要作用我们后边说,先来看一下HandlerThread里面都做了哪些东西??主要是看它的run方法,HandlerThread类和一般的thread类区别就在于,它的run方法里面创建了looper。而且IntentService通过looper,创建了handler。这样的话,intentservice通过handler发送消息,最后会在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,会接着调用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发送了一条消息,会进入handlerthread的looper,这时候又是涉及到了线程切换 。这块怎么讲呢???以前以为类在哪个线程创建,这个类以及这个类的方法,就属于哪个线程,这个是极其错误的想法,应该是这个类的方法,被哪个线程调用了,这个方法就属于哪个线程。这么一看的话。

intentservice发送了消息,然后通过HandlerThread的looper进入到HandlerThread线程,而这个线程里面的looper又会调用,handler的handlemessage,进而调用onHandleIntent方法。这时候耗时任务,就相当于是在onHandleIntent类里面调用的。从而达到了切换线程的操作。

Android中的线程池

线程池的优点:
(1)重用线程池里面的线程,避免创建和销毁线程带来的性能开销
(2)能有效控制线程池的最大并发数,避免大量线程之间因为互相抢占系统资源而导致阻塞
(3)能够对线程进行简单的管理,并提供定时执行以及制定间隔循环执行等功能

ThreadPoolExecutor

(1)线程池中线程数量未达到核心线程数量,就会直接启动核心线程
(2)如果线程数量已经或者超过核心线程数量,那么就会排队等待
(3)如果没办法将任务插入到任务队列,这时候未达到线程池该规定的最大值,那么就会启动一个非核心线程
(4)如果线程数量达到线程池规定的最大值,那么就拒绝执行此任务。

上一篇下一篇

猜你喜欢

热点阅读