android 循环机制,Android IntentService源码理解 及 HandlerThread构建消息循环机制分析...

前言:前面写了Handler的源码理解,关于Handler在咱们Android开发中是处处能见到的异步通讯方式。那么,在Android原生里,有那些也有到了Handler机制的呢?有不少,好比咱们今天所要理解分析的IntentService就使用到了Handler。接下来,咱们来深刻了解一下。html

HandlerThread:android

IntentService使用到了Handler+HandlerThread构建的带有消息循环的异步任务处理机制,咱们先简单看一下HandlerThread是如何工做的吧。并发

HandlerThread的使用步骤:app

//建立HandlerThread实例

HandlerThread handlerThread = new HandlerThread("handlerThread");//启动HandlerThread线程

handlerThread.start();//构建消息循环处理机制

Handler handler = new Handler(handlerThread.getLooper(), newHandler.Callback() {

@Overridepublic booleanhandleMessage(Message msg) {return false;

}

});

以上三步的顺序不能乱,必须严格按照步骤来。第三步是将HandlerThread对象中的looper对象做为Handler第一个参数,咱们由前面的Handler解析可知道,咱们指定了Looper对象,那咱们的handler的线程looper对象就不用新建,而是使用当前传入的线程的looper对象。异步

第一步,建立HandlerThread对象,HandlerThread咱们能看到,它继承自Thread,它有两个构造函数ide

publicHandlerThread(String name) {super(name);

mPriority=Process.THREAD_PRIORITY_DEFAULT;

}

public HandlerThread(String name, intpriority) {super(name);

mPriority=priority;

}

两个构造方法的都须要传一个任意字符串参数,参数的主要做用就是指定该线程的名称;第二个构造方法多传一个优先级参数,不传则默认第一个构造方法中的Process.THREAD_PRIORITY_DEFAULT,根据需求自行决定便可;函数

第二步,启动HandlerThread线程,为何咱们必需要先启动HandlerThread,咱们来看看run()就明白了oop

@Overridepublic voidrun() {

// 得到当前线程的id

mTid=Process.myTid();

// 准备循环条件

Looper.prepare();

// 持有锁机制来得到当前线程的Looper对象synchronized (this) {

mLooper=Looper.myLooper();

// 发出通知,当前线程已经建立mLooper对象成功,这里主要是通知getLooper方法中的wait

notifyAll();

}

// 设置当前线程的优先级

Process.setThreadPriority(mPriority);

// 该方法实现体是空的,子类能够实现该方法,做用就是在线程循环以前作一些准备工做,固然子类也能够不实现。

onLooperPrepared();

// 启动loop

Looper.loop();

mTid= -1;

}

代码注释写的很是清楚了,在run()方法中主要是调用了Looper.prepare()和Loop.loop()构建了一个循环线程;咱们能够注意一下的是,在loop()循前调用了onLooperPreapared()方法,这个方法可自行实现,作一些线程循环以前的准备工做,这就有了很好的拓展性了;notifyAll()主要是通知getLooper()中的wait,咱们看一下getLooper()方法;ui

publicLooper getLooper() {if (!isAlive()) {return null;

}//If the thread has been started, wait until the looper has been created.//若是线程已启动,looper对象为空,则继续等待,前面的唤醒就能够唤醒当前的等待

synchronized (this) {while (isAlive() && mLooper == null) {try{

wait();

}catch(InterruptedException e) {

}

}

}returnmLooper;

}

第三步,构建消息循环机制,该步骤这里就不详细说了,前面《Android异步消息处理机制掌握,从源码了解常使用的Handler》看事后就能理解了。this

OK,咱们讲了这么多HandlerThread的分析理解,那么IntentService的理解就比较容易了,咱们如今来看看IntentService吧;

publicIntentService(String name) {super();

mName=name;

}

IntentService是继承自Service的,是启动一个服务进行异步任务处理的,该服务会在执行完任务后自行终止;IntentService的构造函数很简单,传入一个字符串参数,指定线程名称;

咱们都知道Service服务生命周期是从onCreate方法开始的,首先来看看onCreate方法作了什么

@Overridepublic voidonCreate() {//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= newServiceHandler(mServiceLooper);

}

很开心,咱们刚刚分析的HandlerThread在这里出现了。onCreate方法建立了一个循环的工做线程HandlerThread,而后将HandlerThread当前线程的looper对象传给Handler做为参数建立一个消息执行者,经过Handler+HandlerThread构建了一个带有消息循环机制的异步任务处理机制;ServiveHandler是IntentService的一个内部类,继承Handler;

Service服务第二步生命周期执行onStartCommand方法;

@Overridepublic int onStartCommand(@Nullable Intent intent, int flags, intstartId) {

onStart(intent, startId);return mRedelivery ?START_REDELIVER_INTENT : START_NOT_STICKY;

}

咱们看到该方法仅仅调用了onStart方法,在IntentService的子类中无需重写该方法,系统会在IntentService接受一个请求开始调用该方法;

@Overridepublic void onStart(@Nullable Intent intent, intstartId) {

Message msg=mServiceHandler.obtainMessage();

msg.arg1=startId;

msg.obj=intent;

mServiceHandler.sendMessage(msg);

}

该方法就是经过ServiceHandler获取一个Message对象,将异步消息请求的intent封装进Message中,并发送给ServiceHandler消息执行者中去处理;

private final class ServiceHandler extendsHandler {publicServiceHandler(Looper looper) {super(looper);

}

@Overridepublic voidhandleMessage(Message msg) {

onHandleIntent((Intent)msg.obj);

stopSelf(msg.arg1);

}

}

实现很简单,继承Handler,在重写消息处理方法中调用IntentService的onHandleIntent方法,onHandleIntent方法也是咱们使用IntentService须要重写的方法,在这个咱们进行咱们的异步任务操做。为何能够在这里进行异步任务操做,当异步任务结束后,调用stopSelf方法自动结束该IntentService服务。前面HandlerThread理解后咱们能够知道这里的handleMessage是在工做线程中执行的;那这样咱们就达到了异步任务处理的目的了。

/*** This method is invoked on the worker thread with a request to process.

* Only one Intent is processed at a time, but the processing happens on a

* worker thread that runs independently from other application logic.

* So, if this code takes a long time, it will hold up other requests to

* the same IntentService, but it will not hold up anything else.

* When all requests have been handled, the IntentService stops itself,

* so you should not call {@link#stopSelf}.

*

*@paramintent The value passed to {@link* android.content.Context#startService(Intent)}.

* This may be null if the service is being restarted after

* its process has gone away; see

* {@linkandroid.app.Service#onStartCommand}

* for details.*/@WorkerThreadprotected abstract void onHandleIntent(@Nullable Intent intent);

onHandleIntent方法是咱们使用IntentService的时候在子类须要重写的方法。经过注释咱们能够知道,每一次只能处理一个intent意图请求,当有多个请求时(客户端屡次调用startCommand方法),其余intent暂时会被阻塞挂起,直到前面的intent请求处理完成才会继续处理下一个intent请求。处理完成请求后,调用stopSelf方法中止当前服务,而后会继而调用Service的onDestroy生命周期方法,从而达处处理完成任务后,服务销毁;

public final void stopSelf(intstartId) {if (mActivityManager == null) {return;

}try{

mActivityManager.stopServiceToken(new ComponentName(this, mClassName), mToken, startId);

}catch(RemoteException ex) {

}

}

@Overridepublic voidonDestroy() {

mServiceLooper.quit();

}

总结:IntentService是一种异步任务处理的方式,继承自Service,使用IntentService需在子类重写onHandleIntent方法,进行异步任务。只要当前服务没有销毁,客户端能够发起多个Intent请求,looper会循环获取请求,一个接一个地进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值