Подтвердить что ты не робот

Java.lang.RuntimeException: может создаваться только один Looper за поток

У меня есть простой поток, который выглядит следующим образом:

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();

Это внутренний класс основного вида деятельности. Этот поток, однако работает не в основном, а внутри другого потока, который работает в main,

В любом случае, этот пример точно такой же, как здесь, но по какой-то причине он дает мне java.lang.RuntimeException: только один Looper может быть создан для каждого потока.

Я не создавал никаких других петлеров, по крайней мере явно где-либо.

4b9b3361

Ответ 1

java.lang.RuntimeException: в каждом потоке может создаваться только один Looper

Исключение выбрано потому, что вы (или основной код Android) уже вызвали Looper.prepare() для текущего исполняемого потока.

Далее проверяется, существует ли Looper для текущего потока, если нет, он создает один, тем самым избегая RuntimeException.

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

         ....
    }

Ответ 2

Вместо того, чтобы просто позвонить Looper.prepare();, сначала проверьте, не существует ли Looper для вашего Thread, если нет, вызовите эту функцию. Вот так:

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