Android实例HandlerThread源码分析

  

HandlerThread简介:
  我们知道螺纹线程是一次性消费品,当线程线程执行完一个耗时的任务之后,线程就会被自动销毁了。如果此时我又有一

  

个耗时任务需要执行,我们不得不重新创建线程去执行该耗时任务。然而,这样就存在一个性能问题:多次创建和销毁线程是很耗

  

系统资源的。为了解这种问题,我们可以自己构建一个循环线程底线分线,当有耗时任务投放到该循环线程中时,线程执行耗

  

时任务,执行完之后循环线程处于等待状态,直到下一个新的耗时任务被投放进来。这样一来就避免了多次创建线程线程导致的

  

性能问题了。也许你可以自己去构建一个循环线程,但我可以告诉你一个好消息,Aandroid SDK中其实已经有一个循环线程的框架

  

了。此时你只需要掌握其怎么使用的就好啦!当然就是我们今天的主角HandlerThread啦!接下来请HandlerThread上场,鼓掌~ ~

  

HandlerThread的父类是线程,因此HandlerThread其实是一个线程,只不过其内部帮你实现了一个电影的循环而已。那么我们

  

先来了解一下处理程序是怎么使用的吧!

  


  

  

<强> 1。创建实例对象

        HandlerThread HandlerThread=new HandlerThread (“HandlerThread”);      

以上参数可以任意字符串,参数的作用主要是标记当前线程的名字。

  

<强> 2。启动HandlerThread线程

         handlerThread.start ();      

到此,我们就构建完一个循环线程了。那么你可能会怀疑,那我怎么将一个耗时的异步任务投放到HandlerThread线程中去执行呢?当然是有办法的,接下来看第三部。

  

<强> 3。构建循环消息处理机制

        处理程序subHandler=新处理程序(handlerThread.getLooper(),新的Handler.Callback () {   @Override   公共布尔handleMessage(消息味精){//实现自己的消息处理   返回true;   }   });      

第三步创建一个处理程序对象,将上面HandlerThread中的电影对象最为处理器的参数,然后重写处理程序的回调接口类中的

  

handlerMessage方法来处理耗时任务。

  

总结:以上三步顺序不能乱,必须严格按照步骤来。到此,我们就可以调用subHandler以发送消息的形式发送耗时任务到线程

  

HandlerThread中去执行。言外之意就是subHandler中回调接口类中的handlerMessage方法其实是在工作线程中执行的。

  

<强> HandlerThread实例:

        包com.example.handlerthread;   进口android.app.Activity;   进口android.os.Bundle;   进口handler;   进口android.os.HandlerThread;   进口android.os.Message;   进口android.view.View;   进口android.view.View.OnClickListener;   进口android.widget.Button;   进口android.widget.TextView;   公开课MainActivity延伸活动{   私人处理器mSubHandler;   私人TextView TextView;   私人按钮按钮;      私人的处理程序。回调mSubCallback=new Handler.Callback () {//该接口的实现就是处理异步耗时任务的,因此该方法执行在子线程中   @Override   公共布尔handleMessage(消息味精){      开关(msg.what) {   例0:   消息msg1=新消息();   msg1。=0;   msg1。对java . lang . system . currenttimemillis (); obj=mUIHandler.sendMessage (msg1);   打破;      默认值:   打破;   }      返回错误;   }   };   @Override   保护空白>/* *   *方便的类,用于启动一个新线程,有电影。电影可以   *用于创建处理程序类。注意()必须开始。   */公共类HandlerThread扩展线程{//线程优先级   int mPriority;//当前线程id   int mTid=1;//当前线程持有的电影对象   尺蠖mLooper;//构造方法   公共HandlerThread(字符串名称){//调用父类默认的方法创建线程   超级(名称);   mPriority=Process.THREAD_PRIORITY_DEFAULT;   }//带优先级参数的构造方法   公共HandlerThread(字符串名称,int优先){   超级(名称);   mPriority=的优先级;   }   ...............   }      

分析:该类开头就给出了一个描述:该类用于创建一个带尺蠖循环的线程,电影对象用于创建处理程序对象,值得注意的是在创建处理

  

对象之前需要调用开始()方法启动线程。这里可能有些人会有疑问?为啥需要先调用开始()方法之后才能创建处理程序呢?后面我们会解答。

Android实例HandlerThread源码分析