您的位置:首页 > 移动开发 > Android开发

Android开发之IntentService和HandlerThread分析

2015-11-13 16:52 513 查看
Android开发之IntentService和HandlerThread分析

近期有一个项目需要用到Service,Service默认情况下是在UI主线程运行的;因此为了防止出现停止响应对话框,防止界面卡住,需要在Service中启动异步线程来进行任务处理;

有一个很方便的封装好的对象就是IntentService;源码如下:

先看几个定义的变量:

private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;

private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}

@Override
public void handleMessage(Message msg) {
//处理Intent
onHandleIntent((Intent)msg.obj);
//结束该任务
stopSelf(msg.arg1);
}
}


onCreat方法:
@Override
public void onCreate() {
super.onCreate();
//new一个HandlerThread
HandlerThread thread = new        HandlerThread("IntentService[" + mName + "]");
thread.start();
//保存下来Looper对象
mServiceLooper = thread.getLooper();
//初始化一个Handler对象
mServiceHandler = new ServiceHandler(mServiceLooper);
}


由上可以看出,IntentService的onCreate方法中运行了一个HandlerThread ,然后根据该任务的Looper实例化了一个Handler,也就是获取了一个异步任务的消息压入器和消息处理器。

然后我们再看看onStart

@Override
public void onStart(Intent intent, int startId) {
//获取消息,压入消息队列
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}


最后看看onHandleIntent方法:

我们需要重写该方法来实现自己的业务需求
@WorkerThread
protected abstract void onHandleIntent(Intent intent);


源码中还有设置Service重新启动方式的部分,这里就不做展示;

从以上可以看出,IntentService就是在Service中启动了一个异步任务来实现Service中的业务处理;

下面我们在看看HandlerThread:

首先:
public class HandlerThread extends Thread {


是继承自Thread的;

再看看run:

@Override
public void run() {
//可以看出,run中首先初始化一个Looper,然后得到该Looper的引用,最后执行Looper中的消息;使Looper运行起来。
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}


HandlerThread的业务十分简单,就是在一个异步任务中新建自己的异步任务队列。

从以上的分析不难看出,只要将项目业务中的需求合理的分开,然后分别实现,最后在将各个部分组合起来,那么就会形成一个运行稳定,功能够用的系统;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: