美文网首页
HandlerThread和IntentService

HandlerThread和IntentService

作者: yuruihua | 来源:发表于2018-04-17 21:52 被阅读0次

    一、 HandlerThread

    HandlerThread继承Thread,是一个线程,内部开启了消息循环

    @Override

    public voidrun() {

        mTid = Process.myTid();

        Looper.prepare();    // 创建Looper

        synchronized (this) {

            mLooper = Looper.myLooper();

            notifyAll();

        }

        Process.setThreadPriority(mPriority);

        onLooperPrepared();

        Looper.loop();  //开启消息循环

        mTid = -1;

    }

    run方法是一个无限循环,可以通过HandlerThread的handler执行任务,在不需要使用HandlerThread的时候需要通过它的quit和quitSafely停止线程

    public HandlergetThreadHandler(){   //获取HandlerThread的handler

        if (mHandler == null) {

            mHandler = new Handler(getLooper());

        }

    return mHandler;

    }

    public booleanquit(){

        Looper looper = getLooper();

        if (looper != null) {

            looper.quit();

            return true;

        }

        return false;

    }

    如何使用HandlerThread:使用HandlerThread的handler.post方法执行任务

    HandlerThread thread = new HandlerThread("threadName");

    thread.start();

    Handler handler = new Handler(thread.getLooper());

    handler.post(new Runnable() {

        @Override

        public void run() {

            //此处在handlerThread.run方法中执行

        }

    });


    二、 IntentService

    IntentServie是一个抽象类,继承自服务,使用的时候需要继承IntentService,因为是服务,它的优先级比较高

    public abstract classIntentServiceextends Service

    内部源码:

    IntentService内部使用了handler和HandlerThread

    public voidonCreate(){

        super.onCreate();

        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");

        thread.start();

        mServiceLooper = thread.getLooper();

        mServiceHandler = new ServiceHandler(mServiceLooper);

    }

    在IntentService被创建的时候开启了子线程HandlerThread,并用它的Looper创建了一个hanlder,在启动服务的时候startService触发onCreate,onStartCommand

    @Override

    public void onStart(@Nullable Intent intent, int startId) {

        Message msg = mServiceHandler.obtainMessage();

        msg.arg1 = startId;

        msg.obj = intent;

        mServiceHandler.sendMessage(msg);

    }

    在启动服务的时候hanler发送一条消息,我们看一下ServiceHandler的实现:

    private final classServiceHandlerextends Handler {

        public ServiceHandler(Looper looper){

            super(looper);

        }

        @Override

        public voidhandleMessage(Message msg) {

            onHandleIntent((Intent)msg.obj);

            stopSelf(msg.arg1);

        }

    }

    在handleMessage中会调用onHandleIntent,执行完后stopSelf销毁自己

    protected abstract void onHandleIntent(@Nullable Intent intent);

    用户可以实现抽象方法onHanleIntent来做具体的任务

    使用方法:

    public class MyIntentService extends IntentService {

        public MyIntentService(String name) {

            super(name);

        }

        protected  void onHandleIntent(@Nullable Intent intent){

            //做具体的任务,此处code运行在子线程HandlerThread中

        }

    }

    首先继承IntentServic

    Intent intent = new Intent(this, MyIntentService.class);

    intent.putExtra("where", "mainActivity");

    startService(intent);

    每启动一次服务,onHandleIntent中代码会执行一次,当多次startService时,因为Looper是顺序处理消息的,因此IntentService也是顺序执行后台任务的。


    三、IntentService优点

    因为IntentService是服务,它的优先级比单纯的线程高,不容易被系统杀死,因此适合执行一些优先级高的后台任务

    相关文章

      网友评论

          本文标题:HandlerThread和IntentService

          本文链接:https://www.haomeiwen.com/subject/vwxmkftx.html