с этой идеей глобальных переменных, я сохранил экземпляр MainActivity в onCreate (); Глобальная переменная Android
public class ApplicationController extends Application {
public static MainActivity this_MainActivity;
}
и открыть диалоговое окно, подобное этому. он работал.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Global Var
globals = (ApplicationController) this.getApplication();
globals.this_MainActivity = this;
}
и в потоке открываю диалоговое окно, подобное этому.
AlertDialog.Builder alert = new AlertDialog.Builder(globals.this_MainActivity);
:)
Это все еще кажется ошибкой в операторе mergeDelayError, но я смог заставить его работать, дублируя observerOn и подписываясь на каждый наблюдаемый.
Observable.mergeDelayError(
Observable.error(new RuntimeException())
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()),
Observable.just("Hello")
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
)
.finallyDo(completeAction)
.subscribe(successAction, errorAction);
Я думаю, вы не дождались события терминала, и основной поток завершается до того, как события будут доставлены вашему наблюдателю. Следующий тест проходит для меня с RxJava 1.0.14:
@Test
public void errorDelayed() {
TestSubscriber<Object> ts = TestSubscriber.create();
Observable.mergeDelayError(
Observable.error(new RuntimeException()),
Observable.just("Hello")
)
.subscribeOn(Schedulers.io()).subscribe(ts);
ts.awaitTerminalEvent();
ts.assertError(RuntimeException.class);
ts.assertValue("Hello");
}
Используйте .observeOn (AndroidSchedulers.mainThread (), true) вместо .observeOn (AndroidSchedulers.mainThread ()
public final Observable<T> observeOn(Scheduler scheduler, boolean delayError) {
return observeOn(scheduler, delayError, RxRingBuffer.SIZE);
}
Выше была подпись функции observOn. Работает следующий код.
Observable.mergeDelayError(
Observable.error(new RuntimeException()),
Observable.just("Hello")
)
.observeOn(AndroidSchedulers.mainThread(), true)
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
});
Получил этот трюк из потока ConcatDelayError: https://github.com/ReactiveX/RxJava/issues/3908#issuecomment-217999009