Android学习笔记——HandlerThread与IntentService

参考:   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 参数,就会等待所有任务都处理完毕才停止。

    

猜你喜欢

转载自www.cnblogs.com/xfdmyghdx/p/10628665.html
今日推荐