使用rxjava计时器和改造

时间:2018-05-15 18:25:03

标签: android timer observable retrofit2 rx-java2

我知道这段代码是反模式,但我怎么能正确编写它。你能帮助我吗?如果web 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 :(得分:0)

您可以使用两个observable。第一个将使用.delay()来显示进度对话框。您将使用第二个来发出请求。如果请求在2秒之前完成 - 请使用.dispose()取消第一个请求。

这是一个例子(它是Kotlin,但你会明白的):

    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
            })