异步服务IntentService

    服务Service虽然是在后台运行,但跟Activity一样都在主线程中,如果后台运行着的服务挂起,用户界面就会卡着不动,俗称死机。后台服务经常要做一些耗时操作,比如批量处理、文件导入、网络访问等,此时不应该影响用户在界面上的操作,而应该开启分线程执行耗时操作。可以通过Thread+Handler机制实现异步处理,也可以通过Android封装好的异步服务IntentService处理。

    使用IntentService有两个好处,一个是免去复杂的消息通信流程;另一个是处理完成后无须手工停止服务,开发者可集中精力进行业务逻辑的编码。话虽如此,我们还是有必要了解一下IntentService的具体实现,入了这行一般都要干上许多年,晚学不如早学。处理器对象位于主线程中,分线程通过Handler对象通知主线程,然后主线程执行Handler对象的handleMessage方法刷新界面。反过来也是允许的,即处理器对象位于分线程中,主线程通过handler对象通知分线程,然后分线程执行Handler对象的handleMessage方法进行耗时处理。

    1、创建异步服务时,初始化分线程的Handler对象,注意下面源码的thread.getLooper方法:

@Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    2、异步服务开始运行时,通过Handler对象将请求数据送给分线程,源码如下:

@Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

    3、分线程在Handler对象的handleMessage方法中,先通过onHandleIntent方法执行具体的事务处理,再调用stopSelf结束指定标识的服务。源码如下:

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

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

了解IntentService的实现思想后,使用过程中需要注意以下4点:

(1)增加一个构造方法,并分配内部线程的唯一名称。

(2)onStartCommand方法要调用父类的onStartCommand,因为父类方法会向分线程传递消息。

(3)耗时处理的业务代码要写在onHandleIntent方法中,不可写在onStartCommand方法中。因为onHandleIntent方法位于分线程,而onStartCommand方法位于主线程。

(4)IntentService实现了onStart方法,却未实现onBind方法,意味着异步服务只能用普通方式启停,不能用绑定方式启停。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值