HandlerThread
HandlerThread继承了Thread,它是一种可以使用Handler的Thread,它实现也很简单,就是在run中通过Looper.prepare()来创建消息队列,并且通过Looper.loop()来开启消息循环,这样再实际使用中就允许在HandlerThread中创建Handle了。

  1. public class HandlerThread extends Thread {
  2. int mPriority;
  3. int mTid = -;
  4. Looper mLooper;
  5. private @Nullable Handler mHandler;
  6.  
  7. public HandlerThread(String name) {
  8. super(name);
  9. mPriority = Process.THREAD_PRIORITY_DEFAULT;
  10. }
  11.  
  12. public HandlerThread(String name, int priority) {
  13. super(name);
  14. mPriority = priority;
  15. }
  16.  
  17. protected void onLooperPrepared() {
  18. }
  19.  
  20. @Override
  21. public void run() {
  22. mTid = Process.myTid();
  23. Looper.prepare();
  24. synchronized (this) {
  25. mLooper = Looper.myLooper();
  26. notifyAll();
  27. }
  28. Process.setThreadPriority(mPriority);
  29. onLooperPrepared();
  30. Looper.loop();
  31. mTid = -;
  32. }
  33.  
  34. public Looper getLooper() {
  35. //Thread.IsAlive属性 ,表示该线程当前是否为可用状态
  36. //如果线程已经启动,并且当前没有任何异常的话,则是true,否则为false
  37. //Start()后,线程不一定能马上启动起来,也许CPU正在忙其他的事情,但迟早是会启动起来的!
  38. if (!isAlive()) {
  39. return null;
  40. }
  41.  
  42. // If the thread has been started, wait until the looper has been created.
  43. synchronized (this) {
  44. while (isAlive() && mLooper == null) {
  45. try {
  46. wait();
  47. } catch (InterruptedException e) {
  48. }
  49. }
  50. }
  51. return mLooper;
  52. }
  53.  
  54. @NonNull
  55. public Handler getThreadHandler() {
  56. if (mHandler == null) {
  57. mHandler = new Handler(getLooper());
  58. }
  59. return mHandler;
  60. }
  61.  
  62. public boolean quit() {
  63. Looper looper = getLooper();
  64. if (looper != null) {
  65. looper.quit();
  66. return true;
  67. }
  68. return false;
  69. }
  70.  
  71. public boolean quitSafely() {
  72. Looper looper = getLooper();
  73. if (looper != null) {
  74. looper.quitSafely();
  75. return true;
  76. }
  77. return false;
  78. }
  79.  
  80. public int getThreadId() {
  81. return mTid;
  82. }
  83. }

IntentService
IntentService是一种特殊的Service,它继承了Service并且它是一个抽象类,因此必须创建它的子类才能使用IntentService
IntentService可用于执行后台耗时的任务,当任务执行后它会自动停止,同事由于IntentService是服务的原因,这导致它的优先级比单纯的线程要高很多,所以IntentService比较适合执行一些高级优先级的后台任务,因为它的优先级高不容易被系统杀死。
在实现上,IntentService封装了HandlerThread和Handler,这一点可以从它的onCreate方法中看出来。

  1. public abstract class IntentService extends Service {
  2. private volatile Looper mServiceLooper;
  3. private volatile ServiceHandler mServiceHandler;
  4. private String mName;
  5. private boolean mRedelivery;
  6.  
  7. private final class ServiceHandler extends Handler {
  8. public ServiceHandler(Looper looper) {
  9. super(looper);
  10. }
  11.  
  12. @Override
  13. public void handleMessage(Message msg) {
  14. onHandleIntent((Intent)msg.obj);
  15. stopSelf(msg.arg1);
  16. }
  17. }
  18.  
  19. public IntentService(String name) {
  20. super();
  21. mName = name;
  22. }
  23.  
  24. public void setIntentRedelivery(boolean enabled) {
  25. mRedelivery = enabled;
  26. }
  27.  
  28. @Override
  29. public void onCreate() {
  30. // TODO: It would be nice to have an option to hold a partial wakelock
  31. // during processing, and to have a static startService(Context, Intent)
  32. // method that would launch the service & hand off a wakelock.
  33.  
  34. super.onCreate();
  35. HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
  36. thread.start();
  37.  
  38. mServiceLooper = thread.getLooper();
  39. mServiceHandler = new ServiceHandler(mServiceLooper);
  40. }
  41.  
  42. @Override
  43. public void onStart(@Nullable Intent intent, int startId) {
  44. Message msg = mServiceHandler.obtainMessage();
  45. msg.arg1 = startId;
  46. msg.obj = intent;
  47. mServiceHandler.sendMessage(msg);
  48. }
  49.  
  50. @Override
  51. public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
  52. onStart(intent, startId);
  53. return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
  54. }
  55.  
  56. @Override
  57. public void onDestroy() {
  58. mServiceLooper.quit();
  59. }
  60.  
  61. @Override
  62. @Nullable
  63. public IBinder onBind(Intent intent) {
  64. return null;
  65. }
  66.  
  67. @WorkerThread
  68. protected abstract void onHandleIntent(@Nullable Intent intent);
  69. }

使用:

  1. class IntentServiceDemo : IntentService("IntentServiceDemo") {
  2. private val TAG = "zmm"
  3.  
  4. /* (non-Javadoc)
  5. * @see android.app.IntentService#onCreate()
  6. */
  7. override fun onCreate() {
  8. Log.e(TAG, "=>onCreate")
  9. super.onCreate()
  10. }
  11.  
  12. override fun onStartCommand(@Nullable intent: Intent?, flags: Int, startId: Int): Int {
  13. Log.e(TAG, "=>onStartCommand")
  14. return super.onStartCommand(intent, flags, startId)
  15. }
  16.  
  17. /* (non-Javadoc)
  18. * @see android.app.IntentService#onDestroy()
  19. */
  20. override fun onDestroy() {
  21. Log.e(TAG, "=>onDestroy")
  22. super.onDestroy()
  23. }
  24.  
  25. override fun onHandleIntent(arg0: Intent?) {
  26. try {
  27. Log.e(TAG, "IntentService 线程:" + Thread.currentThread().id)
  28. Thread.sleep()
  29. } catch (e: InterruptedException) {
  30. e.printStackTrace()
  31. }
  32.  
  33. }
  34. }
  1. var mServiceIntent = Intent(this@MainActivity, IntentServiceDemo::class.java)
  2. startService(mServiceIntent)

Android HandlerThread和IntentService的更多相关文章

  1. Android HandlerThread与IntentService

    HandlerThread本质上是一个线程类,它继承了Thread: HandlerThread有自己的内部Looper对象,可以进行looper循环: 通过获取HandlerThread的loope ...

  2. Android开发——HandlerThread以及IntentService详解

    .HandlerThread Android API提供了HandlerThread来创建线程.官网的解释是: //Handy class for starting a new thread that ...

  3. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我又有一 个耗时任务需要执行,我们不得不重新创建线 ...

  4. Android HandlerThread 源代码分析

    HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又 ...

  5. Android HandlerThread分析

    基础概念:HandlerThread 是一个包含 Looper 的 Thread,我们可以直接使用这个 Looper 创建 Handler,本质上还是Thread Handler 必须要和 Loope ...

  6. Android HandlerThread 的使用及其Demo (转)

    转自http://www.cnblogs.com/hnrainll/p/3597246.html 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现同时完成多 ...

  7. Android HandlerThread 的使用及其Demo

    今天我们一起来学习下一个Android中比较简单的类HandlerThread,虽然它的初始化有点小麻烦. 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现 ...

  8. Android HandlerThread详解

    概述 Android HandlerThread使用,自带Looper消息循环的快捷类. 详细 代码下载:http://www.demodashi.com/demo/10628.html 原文地址: ...

  9. Android进阶:二、从源码角度看透 HandlerThread 和 IntentService 本质

    上篇文章我们讲日志的存储策略的时候用到了HandlerThread,它适合处理"多而小的任务"的耗时任务的时候,避免产生太多线程影响性能,那这个HandlerThread的原理到底 ...

随机推荐

  1. Java8-函数复合用法

    JDK8自带的函数式接口Function有两个默认方法andThen和compose,它们都返回Function的一个实例,可以用这两个方法把Function接口所代表的的Lambda表达式复合起来. ...

  2. ASP.NET Core 1.0 Configuration 配置管理

    documentation: https://docs.asp.net/en/latest/fundamentals/configuration.html github: https://github ...

  3. Evenbus简单用法

    Evenbus是一个开源插件,可以帮我们在app里面进行数据传递,传递的对象为Object,就是说可以传输任何对象,但是一般为了拓展性和维护性,我们都用来传输Bean类型. 这个插件最重要的是注册和反 ...

  4. 全网最详细的hive-site.xml配置文件里添加<name>hive.cli.print.header</name>和<name>hive.cli.print.current.db</name>前后的变化(图文详解)

    不多说,直接上干货! 比如,你是从hive-default.xml.template,复制一份,改名为hive-site.xml 一般是 <configuration> <prope ...

  5. java+selenium+maven+testng框架(一)安装搭建

    1.安装jdk(注意:需配置环境变量,可自行百度方法); 2.安装eclipse; 3.安装maven(注意:需配置环境变量,可自行百度方法); 4.在eclipse中新建maven项目 新建成功 注 ...

  6. elasticSearch6源码分析(11)client

    1.RestClient /** * Client that connects to an Elasticsearch cluster through HTTP. * <p> * Must ...

  7. Docker基础教程(安装篇)

    Linux安装: 1.yum -y install docker-io 2.service docker start 3.chkconfig docker on Window安装: Docker 引擎 ...

  8. JSONPath使用说明

    # JSONPath - XPath for JSON A frequently emphasized advantage of XML is the availability of plenty t ...

  9. 创建自己的OAuth2.0服务端(一)

    如果对OAuth2.0有任何的疑问,请先熟悉OAuth2.0基础的文章:http://www.cnblogs.com/alunchen/p/6956016.html 1. 前言 本篇文章时对 客户端的 ...

  10. ABP 邮箱设置

    以上为QQ企业邮箱配置  密码为企业邮箱密码 个人QQ邮箱 需要在邮箱设置里面  在账号里面打开  POP3/SMTP服务 密码为授权码 并把SMTP服务器设置为 smtp.qq.com QQ邮箱控制 ...