Используйте RxJava для цепочки наблюдаемых в сложных условиях

Я хочу создать заставку в Android. Во время загрузки заставки загрузчик изображений попытается получить более новую заставку с сервера, а затем более новое изображение будет сохранено в локальном хранилище и использовано в качестве изображения заставки при следующем запуске. И заставка останется на 5 секунд, а затем перейдет к основному действию. Также нам нужен счетчик обратного отсчета на заставке.

Я могу использовать Observable.interval, чтобы закрыть заставку по завершении и обновить счетчик при следующем испускании. Но должен ли я загружать изображение при запуске счетчика, а тайм-аут для задачи получения изображения также составляет 5 с, если мы не смогли получить изображение, а затем отменить задачу?

splash_sub = Observable
            .interval(SPLASH_INTERVAL, TimeUnit.SECONDS) //to emit event every 1s
            .take(SPLASH_DURATION) //limit the event number to 5, i.e. 5s to complete
            .subscribeOn(Schedulers.newThread()) //timer and event emitting run in background
            .observeOn(AndroidSchedulers.mainThread()) //subscriber callback run in UI thread
            .subscribe(new Observer<Long>() {
                @Override
                public void onCompleted() {
                    dismissSplash(); //dismiss the Splash Screen and enter the Main Activity
                }

                @Override
                public void onError(Throwable e) {
                    Toast.makeText(getApplicationContext(), "Error!", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onNext(Long aLong) {
                    Log.d(TAG, aLong.toString());
                    textView.setText(String.format("%s", aLong));
                }
            });

person Peng Wang    schedule 10.12.2015    source источник


Ответы (1)


Если я понимаю ваш вопрос, вы хотите загрузить изображение, пока вы ждете заставки.

более простой вариант, который у вас есть, просто создайте свой:

imageDownloadObservable
  .timeout(SPLASH_DURATION * SPLASH_INTERVAL, TimeUnit.SECONDS)
  .subscribe();

и то и другое произойдет одновременно.

Если вы хотите отключить заставку, когда изображение загружается или через 5 секунд (первое, что происходит), это можно сделать с помощью оператора слияния.

person CristianGM    schedule 19.08.2016