IntentService源码分析

作者: 上官若枫 | 来源:发表于2018-07-27 16:04 被阅读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)如果线程数量达到线程池规定的最大值,那么就拒绝执行此任务。

    相关文章

      网友评论

        本文标题:IntentService源码分析

        本文链接:https://www.haomeiwen.com/subject/xryimftx.html