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。