Android开发之IntentService和HandlerThread分析

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的业务十分简单,就是在一个异步任务中新建自己的异步任务队列。
从以上的分析不难看出,只要将项目业务中的需求合理的分开,然后分别实现,最后在将各个部分组合起来,那么就会形成一个运行稳定,功能够用的系统;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值