HandlerThread和IntentService

HandlerThread和IntentService:

一、 HandlerThread

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

@Override
public void run() {
    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 Handler getThreadHandler(){   // 获取HandlerThread的handler
    if (mHandler == null) {
        mHandler = new Handler(getLooper());
    }
   return mHandler;
}

 

public boolean quit(){
    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 class IntentServiceextends Service

内部源码:

IntentService内部使用了handler和HandlerThread

public void onCreate(){
    super.onCreate();
    HandlerThreadthread = 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 class ServiceHandlerextends Handler {
    public ServiceHandler(Looper looper){
        super(looper);
    }

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

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

protected abstract void onHandleIntent(@Nullable Intentintent);

用户可以实现抽象方法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是服务,它的优先级比单纯的线程高,不容易被系统杀死,因此适合执行一些优先级高的后台任务

 

阅读更多
个人分类: Android
上一篇View测量,布局,绘制三大流程
下一篇Java集合之HashMap
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭