Чтобы продемонстрировать более четко:
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
Can't create handler inside thread that has not called Looper.prepare()
Это в основном означает, что вам нужно использовать поток пользовательского интерфейса при вызове этого кода. Поток пользовательского интерфейса нужно будет использовать для отображения вашего диалога.
Вы можете сделать:
runOnUiThread {
dialogPopUp("Error parameters", mContext ).showDialog()
}
Обратные вызовы OkHttp выполняются в фоновом потоке, если вы используете enqueue, и показ диалога является задачей пользовательского интерфейса, поэтому его необходимо запустить в потоке пользовательского интерфейса.
В вашем случае вы можете легко сделать это, запустив код диалога, используя runOnUiThread
.
runOnUiThread {
dialogPopUp("Error parameters", mContext ).showDialog()
}
Так же, как вы сделали в своем блоке else. Вы также можете достичь этого с помощью обработчика , который был создан в потоке пользовательского интерфейса.
Обновление: При более внимательном рассмотрении вашего кода я понял, что вы запускаете fetchJson
в фоновом потоке, используя функцию doAsync
. Когда вы используете enqueue
в OkHttp.Call
, вы в основном отправляете его для выполнения в фоновом потоке, поэтому нет необходимости использовать doAsync
. Если вы удалите doAsync
, вам больше не нужно будет использовать runOnUiThread
, поскольку обратный вызов будет выполняться в потоке пользовательского интерфейса.