HandlerThread和IntentService

HandlerThread

  HanderThread是Thread的子类。其内部封装了一个handler。用于别的线程向该线程发送消息的情况。

@Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }

  run方法如上。因此该线程自带looper。其中onLooperPrepared方法可以由我们重写来做一些准备工作。

@NonNull
    public Handler getThreadHandler() {
        if (mHandler == null) {
            mHandler = new Handler(getLooper());
        }
        return mHandler;
    }

  该方法能够获取一个与本线程绑定的handler。用该handler发消息就可以在该线程中执行相应的代码了。


IntentService

  IntentService是Service的一个具体实现。使用方法和普通Service类似。只不过IntentService内部封装了一个子线程和handler。利用MessageQueue的顺序执行来实现子线程顺序执行任务的效果,并能在执行完所有任务后退出。

@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方法中创建子线程并绑定handler。

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

  onStart方法中向handler发送intent,也就是要执行的任务。

@Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

  onStartCommand方法会调用onStart方法,也就是说每次startService时都会把消息放到MessageQueue中去顺序执行。

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

  onHandIntent是我们要重写的具体执行操作的代码。执行完后会执行stopSelf关闭Service。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值