【问题标题】:java.lang.RuntimeException: Only one Looper may be created per threadjava.lang.RuntimeException:每个线程只能创建一个 Looper
【发布时间】:2014-05-27 03:34:46
【问题描述】:

我有一个简单的线程是这样的:

public class AwesomeRunnable extends Thread {

    Handler thisHandler = null;
    Handler uihandler = null;
    String update = null;
    long time = 0;

    public AwesomeRunnable(Handler h, long howLong) {
        uihandler = h;
        time = howLong;
    }

    public void run() {
        Looper.prepare();
        thisHandler = new Handler();
  ...

编辑:添加启动可运行的代码

public class StartCycle implements Runnable {

    @Override
    public void run() {

        pomodoroLeft = numPomodoro;
        while(pomodoroLeft > 0) {
            pomodoroLeft--;
            actualSeconds = 6 * ONE_SECOND;
            runnable = new AwesomeRunnable(myHandler, actualSeconds);
            runnable.start();
            waitForClock();

它是主要活动的内部类。 这个线程,但是不在主活动上运行,而是在另一个在活动上运行的线程内.

不管怎样,这个例子完全here一样,但是由于某种原因它给了我java.lang.RuntimeException:每个线程只能创建一个Looper。

我没有创建任何其他 Looper,至少在任何地方都明确表示。

【问题讨论】:

  • 你能显示以AwesomeRunnable开头的代码吗?
  • 看起来不错。哪一行抛出异常?哪个线程? (如果您在终端窗口中查看 logcat 输出,请使用 adb logcat -v threadtime 在每行显示线程 ID。)必须在单个线程中创建循环器两次,因此您需要确定它是否正在运行在错误的线程中,或者在新线程中运行了两次。
  • @fadden Looper.prepare(); 正在引发异常。好的...将按照您的建议尝试通过日志输出。
  • @fadden 实际上错误信息的第一行是:FATAL EXCEPTION: main.这是否意味着它以某种方式在主线程上创建了另一个弯针?但为什么呢?
  • 听起来像是在尝试。如果两个数字(pid 和 tid)相同,那么它肯定是在尝试在主线程中创建一个新的 Looper。检查堆栈跟踪并查看调用该函数的内容。

标签: java android multithreading


【解决方案1】:

java.lang.RuntimeException: 每个线程只能创建一个 Looper

抛出异常是因为您(或核心 Android 代码)已经为当前正在执行的线程调用了Looper.prepare()

下面会检查当前线程是否已经存在一个Looper,如果没有就创建一个,从而避免RuntimeException

    public void run() 
    {
            if (Looper.myLooper() == null)
            {
              Looper.prepare();
            }
            thisHandler = new Handler();

         ....
    }

【讨论】:

  • 如果您在代码中提供某种解释,那就太好了。
  • 简单明了,也为我工作,非常感谢
  • 在 Android 中不起作用 -> 适配器回收 -> ViewHolder ->view.setOnClickListener
  • 添加了解释。
  • myLooper这个命名真的很有趣。
【解决方案2】:

不只是调用Looper.prepare();,首先检查您的Looper 是否不存在Thread,如果不存在,则调用该函数。像这样:

if (Looper.myLooper()==null)
    Looper.prepare();

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2012-01-16
    • 2011-04-22
    • 2019-05-05
    • 1970-01-01
    • 2019-01-22
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多