AndroidSchedulers.mainThread наблюдает onError раньше, чем onNext [duplicate]

с этой идеей глобальных переменных, я сохранил экземпляр 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);
  1. Открыть MainActivity
  2. Запустить поток.
  3. Открыть диалог из потока -> work.
  4. Нажмите кнопку «Назад» (onCreate будет вызываться и удалить первую MainActivity)
  5. Запустится новая MainActivity. (и сохраните его экземпляр для глобалов)
  6. Откройте диалог из первого потока -> он откроется и будет работать.

:)

14
задан Bobbake4 21 August 2015 в 16:09
поделиться

3 ответа

Это все еще кажется ошибкой в ​​операторе 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);
3
ответ дан Bobbake4 24 August 2018 в 02:53
поделиться

Я думаю, вы не дождались события терминала, и основной поток завершается до того, как события будут доставлены вашему наблюдателю. Следующий тест проходит для меня с 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");
}
1
ответ дан akarnokd 24 August 2018 в 02:53
поделиться

Используйте .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

7
ответ дан nizam.sp 24 August 2018 в 02:53
поделиться
Другие вопросы по тегам:

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