【问题标题】:HandlerThread needs to post to own queueHandlerThread 需要发布到自己的队列
【发布时间】:2013-07-17 11:04:26
【问题描述】:

我有一个扩展 HandlerThread 的 MyThread,我需要在 MyThread 类中将 runnables 发布到它的队列中。

我知道如何做到这一点的唯一方法是调用

h = new MyHandler(Looper.myLooper());

然后h.post(r) 发布 Runnable r。

但我不确定在哪里放置新的 MyHandler() 行,因为需要先启动线程才能获得 looper。还有另一个类启动 MyThread 并向其发布可运行文件,但现在我也需要在类中执行此操作。有什么想法吗?

已编辑:

class MyThread extends HandlerThread {


private MyHandler h;
private Runnable r;

MyThread(String name, int priority) {
    super(name, priority);
    //h = new MyHandler();
    r = new MyRunnable();
}

@Override
public void start() {
    super.start();
    //h = new MyHandler();
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        //...
    }
}

void startCount(long delay) {
    h.postDelayed(r, delay);
}

}

两条注释行产生相同的结果:r 在主线程中执行,而不是在我想要实现的这个 HandlerThread 中执行。

【问题讨论】:

  • 我知道每次我想发布可运行文件时都调用new MyHandler(Looper.myLooper()).post(r); 可以正常工作,但是有没有更好的方法呢?

标签: android handler looper


【解决方案1】:
HandlerThread ht = ...
ht.start();
Handler h = new Handler(ht.getLooper(), callback)

【讨论】:

  • 当 HandlerThread 想要将可运行对象发布到自己的队列时,线程应该已经启动了。我的问题是,我不知道“何时”让处理程序进入自己的循环器。 . 它当然不能在构造函数中,因为线程还没有在那里启动..
  • 线程已经被另一个类启动了..我不认为你可以启动同一个线程两次?
  • 不,你不能。我认为最简单的方法是扩展 HandlerThread 并在此处保留对 Handler 的引用,因此当您启动此 HandlerThread 时,一个 Handler 就是。还创建并分配给一个字段供以后使用
  • 类 MyHandlerThread 扩展 HandlerThread { Handler mHandler; }
  • 真正的Handler是什么时候创建的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多