【问题标题】:getLooper() returns null after started HandlerThreadgetLooper() 启动 HandlerThread 后返回 null
【发布时间】:2016-01-06 08:36:42
【问题描述】:

我有一个类扩展HandlerThread,它看起来像这样:

public class MyHandlerThread extends HandlerThread {

  private Object lock;

  //constructor
  public MyHandlerThread() {
     super(“MyHandlerThread”);
     lock = new Object();
  }

  public void prepare() {
     //starts the handler thread
     start();

     //Wait for thread starting
     Log.d(TAG, "wait for thread starting…");
     synchronized (lock) {
        try {
            lock.wait(5000);
        } catch (InterruptedException e) {
            Log.e(TAG, "Failed to wait for thread to start");
        }
     }

     //WHY getLooper() returns null here?
     if(getLooper() == null) {
         Log.d("GET LOOPER NULL!");
     }
  }

  @Override
  public void run() {
    Log.d("run() begin...");
    initializeSomeObjects()
    Log.d(“initialise objects done!”);

    //Notify that run() finished
    synchronized (lock) {
       lock.notify();
    }
    Log.d("run() end!”);
  }

}

正如你在上面看到的,prepare() 函数启动线程并等待run() 完成,然后尝试获取 looper。

在另一个类中,我创建了一个 MyHandlerThread 的实例并启动它:

MyHandlerThread myThread = new MyHandlerThread();
myThread.prepare();

控制台中显示的日志:

wait for thread starting…
run() begin...
initialise objects done!
run() end!
GET LOOPER NULL!

为什么在prepare()函数中,调用getLooper()返回null,虽然线程已经启动(run()被执行)?

【问题讨论】:

  • 1) 创建一个新的HandlerThread: HandlerThread ht = new HandlerThread("foo"); 2) 启动它 3) 制作一个Handler: Handler h = new Handler(ht.getLooper()) {... 4) 发送Messages: h.sendEmptyMessage(999)
  • 谢谢,我在谷歌找到了同样的东西,但为什么我的方法getLooper() 是NULL?我的代码看起来像执行相同的步骤,唯一的区别是我在类中启动线程。
  • 确实有 3 个步骤可以让 Handler / HandlerThread 准备就绪,还有一个步骤可以设置 Messages... 为什么要让它变得更难?为什么要扩展HandlerThread
  • 我很想知道背后的原因。这是一种了解下面发生的事情的方法,不是吗?简单地让它工作不是我的意思,这就是为什么我说我也通过谷歌找到了你的建议。
  • 所以如果你想知道下面是什么,那么看看here

标签: android android-handler android-looper android-handlerthread


【解决方案1】:

HandlerThread LooperHandlerThread#run() 中初始化。

如果你重写该方法并且不调用super.run(),则不会执行来自超类的初始化代码。

【讨论】:

  • 不是真的:getLooper() 方法返回一个与此 HandlerThread 关联的 Looper,顺便说一句,他是从 UI 线程调用它,而 UI 线程确实有一个 Looper,没有如果?
  • @pskink 谢谢,忽略了它是HandlerThread#getLooper() 而不是例如Looper#myLooper()。答案重写。
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2017-05-11
  • 1970-01-01
相关资源
最近更新 更多