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

use*_*519 26 java multithreading android

我有一个简单的线程,如下所示:

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();
  ...
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

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

无论如何,这个例子与这里完全相同,但由于某种原因它给了我java.lang.RuntimeException:每个线程只能创建一个Looper.

我没有创造任何其他的掠夺者,至少在任何地方都是如此.

Aow*_*aza 81

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

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

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

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

         ....
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果你在代码中提供某种解释会很好. (7认同)
  • 添加了解释. (3认同)
  • 简单明了,也为我工作,非常感谢你 (2认同)

小智 5

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

if (Looper.myLooper()==null)
    Looper.prepare();
Run Code Online (Sandbox Code Playgroud)