IntentService源码分析
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)如果线程数量达到线程池规定的最大值,那么就拒绝执行此任务。