你的位置:首页 > 软件开发 > 操作系统 > Android多线程(三)

Android多线程(三)

发布时间:2015-10-08 13:00:21
上次讲了关于Android多线程中通信中Thread、Handler、Looper等的基础概念和基本用法,用现实世界两个人写信交流的过程来理解是再好不过了。但是不得不说这一套完整的细节的确很繁琐,好在Android中为我们提供了另一个简化的API—&m ...

  上次讲了关于Android多线程中通信中Thread、Handler、Looper等的基础概念和基本用法,用现实世界两个人写信交流的过程来理解是再好不过了。但是不得不说这一套完整的细节的确很繁琐,好在Android中为我们提供了另一个简化的API——HandlerThread,通过使用HandlerThread,我们可以以一种简单的方式开启线程、进行线程通信。Let's do it!

三、HandlerThread

  1)参考文档:http://developer.android.com/reference/android/os/HandlerThread.html

  前面的连篇文章中我都贴出来相应内容的官方文档地址,也斗胆说了一下读文档的重要性。这次我们换一种方式——读源代码,好的代码本身就是一份文档,除了会写还得能读!如何找到Android的源码?不管你用的是不再更新的ADT+Eclipse还是AS(Android studio),你的电脑里一定得下载sdk,在sdk目录下有个叫sources的文件夹,里面放的就是Android的系统源码。(开源**好!)如果你没有,那就“FQ”下一份,如何快速更新sdk我会在下一篇博客里写......

  2)HandlerThread源码:

  我在这把源码贴出来方便查看(我电脑上的源码是Android-22的)

package android.os;/** * Handy class for starting a new thread that has a looper. The looper can then be * used to create handler classes. Note that start() must still be called. */public class HandlerThread extends Thread {  //线程的优先级  int mPriority;  //线程id  int mTid = -1;  //与线程绑定的Looper对象  Looper mLooper;  public HandlerThread(String name) {    super(name);    mPriority = Process.THREAD_PRIORITY_DEFAULT;  }    /**   * Constructs a HandlerThread.   * @param name   * @param priority The priority to run the thread at. The value supplied must be from   * {@link android.os.Process} and not from java.lang.Thread.   */  public HandlerThread(String name, int priority) {    super(name);    mPriority = priority;  }    /**   * Call back method that can be explicitly overridden if needed to execute some   * setup before Looper loops.   * 这里是你需要实现的部分,你的在这里实现对Handler的准备工作,定义你的Hadnler并实现   *handlerMessage(Message msg)方法。   */  protected void onLooperPrepared() {  }   @Override  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;  }  /**   * Quits the handler thread's looper.   * <p>   * Causes the handler thread's looper to terminate without processing any   * more messages in the message queue.   * </p><p>   * Any attempt to post messages to the queue after the looper is asked to quit will fail.   * For example, the {@link Handler#sendMessage(Message)} method will return false.   * </p><p >   * Using this method may be unsafe because some messages may not be delivered   * before the looper terminates. Consider using {@link #quitSafely} instead to ensure   * that all pending work is completed in an orderly manner.   * </p>   *   * @return True if the looper looper has been asked to quit or false if the   * thread had not yet started running.   *   * @see #quitSafely   */  public boolean quit() {    Looper looper = getLooper();    if (looper != null) {      looper.quit();      return true;    }    return false;  }  /**   * Quits the handler thread's looper safely.   * <p>   * Causes the handler thread's looper to terminate as soon as all remaining messages   * in the message queue that are already due to be delivered have been handled.   * Pending delayed messages with due times in the future will not be delivered.   * </p><p>   * Any attempt to post messages to the queue after the looper is asked to quit will fail.   * For example, the {@link Handler#sendMessage(Message)} method will return false.   * </p><p>   * If the thread has not been started or has finished (that is if   * {@link #getLooper} returns null), then false is returned.   * Otherwise the looper is asked to quit and true is returned.   * </p>   *   * @return True if the looper looper has been asked to quit or false if the   * thread had not yet started running.   */  public boolean quitSafely() {    Looper looper = getLooper();    if (looper != null) {      looper.quitSafely();      return true;    }    return false;  }  /**   * Returns the identifier of this thread. See Process.myTid().   */  public int getThreadId() {    return mTid;  }}

原标题:Android多线程(三)

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录