【问题标题】:Android handler: Can't create handler inside thread that has not called Looper.prepare()Android 处理程序:无法在未调用 Looper.prepare() 的线程内创建处理程序
【发布时间】:2014-04-17 18:42:52
【问题描述】:

我有一个线程:

public class KelvinThread implements Runnable {

private Handler mSoundHandler;

public KelvinThread() {
    super();
    mSoundHandler = new Handler();
}

private Runnable mSoundThread = new Runnable() {
    public void run() {
        // my treatment
    }
};

@Override
public void run() {
    while (true) {
        // ....
        mSoundHandler.postDelayed(mSoundThread, 2000);
        // ....
    }
}

这个线程“KelvinThread”是从另一个线程创建和启动的。

我有这个错误:

无法在未调用 Looper.prepare() 的线程内创建处理程序

当我的处理程序被分配时:mSoundHandler = new Handler();

谢谢你们的帮助!

【问题讨论】:

  • 在七个地狱中,为什么要将 Handler 与本机线程混合使用?我认为这是一个非常丑陋的解决方案,您不应该这样做 - 这似乎是糟糕的应用程序逻辑设计。
  • 其实不然。有时您必须这样做,例如从线程或其他情况下触发 UI 更改。真的取决于。
  • 嗨拉格纳,我读了你的建议。但是没有 Handler 怎么做触发器呢?还有其他方法吗?

标签: android multithreading handler


【解决方案1】:

请参考Looper documentation。还有例子。

UPD 您也许还可以使用 Looper.getMainLooper() 将处理程序附加到主循环器,而不是创建线程一。

【讨论】:

  • 弗拉基米尔,感谢您的建议。我是新手,所以如果你有我的例子,那就太好了。
  • 如果符合您的要求,您可以使用主循环器创建处理程序。例如new Handler(Looper.getMainLooper())
  • 弗拉基米尔,在我的情况下,使用 Handler 概念还是用 Timer 和 TimerTask 概念替换它更好?我的应用程序中没有 UI,它只是 pcDuino 板上的一项服务。非常感谢,
  • Timer 是 java 方式,在 Android 中不推荐使用,因为它是基于在资源有限的系统中创建全新的 Thread。对于短期使用 Handler,对于较长的 AlarmManager。如果您在自己的线程中循环,则可以使用 System.currentTimeMillis() 和差异来计算超时并执行您的操作(计时器)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2011-09-06
相关资源
最近更新 更多