定义类的代码:

public class HandlerThread extends Thread {        public void run() {        mTid = Process.myTid();        Looper.prepare();        synchronized (this) {            mLooper = Looper.myLooper();            notifyAll();        }        Process.setThreadPriority(mPriority);        onLooperPrepared();        Looper.loop();        mTid = -1;    }        /**     * This method returns the Looper associated with this thread. If this thread not been started     * or for any reason is isAlive() returns false, this method will return null. If this thread      * has been started, this method will block until the looper has been initialized.       * @return The looper.     */    public Looper getLooper() {        if (!isAlive()) {            return null;        }                // If the thread has been started, wait until the looper has been created.        synchronized (this) {            while (isAlive() && mLooper == null) {                try {                    wait();                } catch (InterruptedException e) {                }            }        }        return mLooper;    }


HandlerThread继承于Thread,是一个线程类。它实现了run方法,我们可以直接调用start方法来运行这个线程。 和我们使用线程的传统方式不一样的是:传统方法中,我们一般是在run方法中做我们实际想做的事情。而HandlerThread已经实现了run方法,不需要我们实现,它在run方法里面启动了一个looper循环,使得HandlerThread具有了处理消息的能力,同时提供了安全的getLooper方法(之所以安全,是因为getLooper使用了wait/notify机制),getLooper()方法使得app可以创建指定Looper的Handler,通过这个Handler我们就可以使用发送消息的方法通知线程做指定的事情。

使用例子如下:

Thread mThread = new HandlerThread("demo", Process.THREAD_PRIORITY_BACKGROUND);mThread.start()  //启动线程,这时run方法会为这个Thread创建消息循环,消息循环是一个死循环,所以这个Thread会一直处于运行状态MyHandler mHandler = new MyHandler( mThread.getLooper( ) )  //使用mThread的looper来实例化一个自定义的Handler


这样我们就得到了一个mHandler的实例,使用mHandler.sendMessage(msg) 就可以让mThread 做指定的事情了(指定的事情是通过msg来区分的),而指定的事情是在 MyHandler的handlerMessage中实现的。

实例代码如下(这个大家应该很熟悉):

class MyHandler extends Handler{    @Override    public void handlerMessage(Message msg)    {         //在这里实现线程需要做的事情(传统的线程使用方式中,我们是在run方法里面实现线程需要做的事情)    }} 


总结:

HandlerThread和传统Thread不同,它有一个消息循环,这个消息循环由run方法来承担,run方法不做任何实际需求的事情,这样使得线程的可控性得到了增强,我们可以通过发送不同的消息让线程做不同的事情。

更多相关文章

  1. 【Android】Android(安卓)SurfaceFlinger之SurfaceFlinger启动过
  2. Android(安卓)的ANR 问题解决
  3. Android(安卓)安装apk的方法
  4. Android(安卓)根据源码详细讲解Handler
  5. Android小项目之欢迎滑动页面(页面布局&底部点点)
  6. Android(安卓)读取XML的两种方法。
  7. Android(安卓)SQLite数据库解析并使用两种方法实现增删改查
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android(安卓)编程下的 Secret Code
  2. android 通过http访问服务器数据
  3. Android(安卓)工程的创建
  4. ubuntu环境下android开发平台的搭建
  5. 成佩涛编程之路——android之jquery使用(
  6. 为什么IOS比Android更吸引开发者
  7. Android小游戏——简单易懂单机人人对战
  8. 【译】Android中构建快速可靠的UI测试
  9. Android(安卓)WebView与JavaScript交互操
  10. 浅谈Android开机启动速度优化(含应用程序