参考: https://blog.csdn.net/javazejian/article/details/52426353
https://www.jianshu.com/p/ab77a2e83c52
https://blog.csdn.net/javazejian/article/details/52426425
- HandlerThread
是一个内部有Looper 的 Thread 子类
与线程池不同的是,HandlerThread是一个串行队列,它只有一个线程。
使用方法:
1.实例化一个HandlerThread对象,参数是该线程的名称
2.通过 handlerThread.start()启动线程
3.实例化一个Handler并且参数为handlerThread.getLooper(),完成handler于handlerThread的绑定 ,
在handlerMessage方法中就是在 handelr_thread线程中执行了
4.可用handler执行异步任务
5.不需要handlerThread时,用 handlerThread.quit()结束线程。
使用样例
private HandlerThread myHandlerThread ; private Handler handler ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化HandlerThread myHandlerThread = new HandlerThread("myHandler") ; //开启HandlerThread myHandlerThread.start(); //将Handler对象与HandlerThread线程绑定 handler =new Handler(myHandlerThread.getLooper()){ @Override publicvoid handleMessage(Message msg) { super.handleMessage(msg); // 这里接收Handler发来的消息,运行在handler_thread线程中 //TODO... } }; //在主线程给Handler发送消息 handler.sendEmptyMessage(1) ; new Thread(new Runnable() { @Override publicvoid run() { //在子线程给Handler发送数据 handler.sendEmptyMessage(2) ; } }).start(); } @Override protected void onDestroy() { super.onDestroy(); //终止HandlerThread运行 myHandlerThread.quit() ; }
- IntentService
是一个继承自Service的抽象类
优点: 相比于线程,因为是服务,优先级更高,所以更不容易被杀死,适合执行一些高优先级的后台任务
相比于普通service , 可以自动创建子线程执行任务,并完成任务后自动退出
使用方法:
创建类 继承IntentService, 重写onHandleIntent 方法,在配置文件中注册
在活动中用intent 配合startService 启动intentService
因为是通过Intent启动,可以在intent中放入相关参数,在onHandleIntent 中可以使用这些参数
内部原理:
在IntentService.onCreate()里创建了一个 HandlerThread对象,和一个ServiceHandler对象(继承自Handler), 构造serviceHandler的参数为handlerThread的Looper, 这样将二者绑定,因为handlerThread是一个子线程,所以serviceHandler就是在子线程中执行任务了。
serviceHandler 把任务请求的 intent 封装为Message 丢给handlerThread 中Looper 的 MessageQueue,,(流程与Handler一样)
最终任务会回到serviceHandler的 handleMessage()方法,而这个方法内部调用的就是我们重写的 onHandlerIntent(),真实地执行任务。
handleMessage()中,调用onHandleIntent() 之后就会调用stopSelf() 结束服务。
在stopSelf()中如果不填入参数,就会立即停止。而填入 msg.arg1 参数,就会等待所有任务都处理完毕才停止。