• 微信

looper.prepare get()!=null){

时间:01:24:47作者:admin分类:时刻浏览:2评论:0

  Looper用于封装了android线程中的消息循环。默认情况下一个线程是不存在消息循环(message loop)的,须要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用。从消息队列里取消息。处理消息。注:写在Looper.loop()之后的代码不会被马上执行。当调用后mHandler.getLooper().quit()后。loop才会中止,其后的代码才干得以执行。

  Looper对象通过MessageQueue来存放消息和事件。一个线程仅仅能有一个Looper。相应一个MessageQueue。

  下面是Android API中的一个典型的Looper thread实现:

  //Handler不带參数的默认构造函数:new Handler()。实际上是通过Looper.myLooper()来获取当前线程中的消息循环,

  //而默认情况下。线程是没有消息循环的,所以要调用 Looper.prepare()来给线程创建消息循环,然后再通过。Looper.loop()来使消息循环起作用。

  另,Activity的MainUI线程默认是有消息队列的。

  所以在Activity中新建Handler时,不须要先调用Looper.prepare()。

  那么遇到了有多Low的问题呢:

  项目中重写了一个HandlerThread,然后定义了post方法。然后在主线程中例如以下实现:

  AsyncHandler.post(new Runnable() {

  @Override

  public void run() {

  try {

  Looper.prepare();

  // 一坨要异步运行的代码******

  Looper.loop();

  } catch (Exception e) {

  // TODO: handle exception

  e.printStackTrace();

  }

  那么明 人一看就看出问题来了 ,这代码一跑异步代码肯定运行不到啊。为啥呢。且看下prepare的实现:

  public static void prepare() {

  prepare(true);

  }

  private static void prepare(boolean quitAllowed) {

  if (sThreadLocal.get() !=null) {

  throw new RuntimeException( Only one Looper may be created per thread

  }

  sThreadLocal.set(new Looper(quitAllowed));

  }

  So,简单,却是问题~

猜你喜欢