Dialog Pop Up и возврат активности

Чтобы продемонстрировать более четко:

public class Test1 {

    public static class LifeBoat extends RuntimeException
    {
        private Test1 passenger;
        public Test1 getPassenger(){return passenger;}
        public LifeBoat(Test1 passenger){this.passenger=passenger;}
    }

    Test1() {
        super(); //once this is finished, there is an Object to GC per JLS 12.6.1. 
        throw new LifeBoat(this);
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalized");
    }

    public static void main(String[] args) throws Exception {
        try {
            new Test1();
        } catch (LifeBoat e) {
            Test1 obj;
            obj=e.getPassenger();
            System.out.println(obj);
        }
        System.gc();
        Thread.sleep(1000);
    }
}

печатает

java.lang.RuntimeException
    at test.Test1.<init>(Test1.java:13)
    at test.Test1.main(Test1.java:24)
test.Test1@6dc8f3cd
finalized
-1
задан ESSETWOPOINTS 9 March 2019 в 19:32
поделиться

2 ответа

Can't create handler inside thread that has not called Looper.prepare()

Это в основном означает, что вам нужно использовать поток пользовательского интерфейса при вызове этого кода. Поток пользовательского интерфейса нужно будет использовать для отображения вашего диалога.

Вы можете сделать:

runOnUiThread {
    dialogPopUp("Error parameters", mContext ).showDialog()
}
0
ответ дан user8159708 9 March 2019 в 19:32
поделиться

Обратные вызовы OkHttp выполняются в фоновом потоке, если вы используете enqueue, и показ диалога является задачей пользовательского интерфейса, поэтому его необходимо запустить в потоке пользовательского интерфейса.

В вашем случае вы можете легко сделать это, запустив код диалога, используя runOnUiThread.

runOnUiThread {
    dialogPopUp("Error parameters", mContext ).showDialog()
}

Так же, как вы сделали в своем блоке else. Вы также можете достичь этого с помощью обработчика , который был создан в потоке пользовательского интерфейса.

Обновление: При более внимательном рассмотрении вашего кода я понял, что вы запускаете fetchJson в фоновом потоке, используя функцию doAsync. Когда вы используете enqueue в OkHttp.Call, вы в основном отправляете его для выполнения в фоновом потоке, поэтому нет необходимости использовать doAsync. Если вы удалите doAsync, вам больше не нужно будет использовать runOnUiThread, поскольку обратный вызов будет выполняться в потоке пользовательского интерфейса.

0
ответ дан Hamed Momeni 9 March 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: