Использование таймера и модификации rxjava - PullRequest
0 голосов
/ 15 мая 2018

Я знаю, что этот код - антипаттерны, но как мне правильно его написать? Вы можете мне помочь? Если веб-API не отвечает в течение 2 секунд, я хочу открыть ProgressDialog. Когда вы ответите, закройте его.

getCompositeDisposable().add(mRemoteUseCase.sendData(profileInfo)
                .subscribeOn(scheduler)
                .observeOn(androidSchedulers)
                .doOnSubscribe(s ->
                {
                    mIsLoading.set(true);
                    Observable.timer(2000, TimeUnit.MILLISECONDS).take(1).subscribeOn(scheduler)
                            .observeOn(androidSchedulers).doOnNext(c -> {
                        if (mIsLoading.get() && isShowProgressDialog) {
                            progressDialog.show();
                        }
                    }).subscribe(l -> {

                    });
                })
                .doAfterTerminate(() -> {
                    mIsLoading.set(false);
                    if (progressDialog.isShowing()) {
                        progressDialog.dismiss();
                    }
                })
                .subscribe(new Consumer<RemoteResponse<UserData>>() {
                               @Override
                               public void accept(RemoteResponse<UserData> remoteResponse) throws Exception {

                                   dataManager.setProfile(profile);

                               }
                           },
                        new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                listener.onError(throwable);

                                dialog = DialogFactory.createSimpleOkErrorDialog(context, "Error");
                                dialog.show();
                            }
                        })
        );

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете использовать две наблюдаемые.Первый будет использовать .delay(), чтобы показать диалог прогресса.Второй вы будете использовать, чтобы сделать запрос.Если запрос заканчивается через 2 секунды - отмените первый с помощью .dispose().

Вот пример (это Котлин, но вы поймете идею):

    val dialogObservable = Single.just(true)
            .observeOn(Schedulers.computation())
            .subscribeOn(AndroidSchedulers.mainThread())
            .delay(2, TimeUnit.SECONDS)
            .subscribe({
                // show dialog
            }, {
                // do something with the error
            })

    val startTime = System.currentTimeMillis()
    mRemoteUseCase.sendData(profileInfo)
            .subscribeOn(scheduler)
            .observeOn(androidSchedulers)
            .subscribe({
                val endTime = System.currentTimeMillis()
                if(TimeUnit.MILLISECONDS.toSeconds(endTime - startTime) <= 2){
                    dialogObservable.dispose()
                }

                // do something else
            }, {
                // do something with the error
            })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...