gpt4 book ai didi

android - 如何连续执行多个 RxJava2 flux

转载 作者:行者123 更新时间:2023-11-29 22:37:00 25 4
gpt4 key购买 nike

我正在 self 介绍 RxJava2,但我觉得我做错了什么。就我而言,我想执行一些以下异步操作。

在这个例子中,第一个 Action 是检查设备是否连接(wifi 或数据,让我们承认这需要时间),然后我想连接到一个 api,然后我想做一个 http 调用以获得一个列表(可观察的)然后使用它。如果这些操作之一失败,则应在订阅中引发和处理 onError 或异常。

我有这个有效的代码:

Single.create((SingleEmitter<Boolean> e) -> e.onSuccess(Connectivity.isDeviceConnected(MainActivity.this)) )
.subscribeOn(Schedulers.io())
.flatMap(isDeviceConnected -> {
Log.i("LOG", "isDeviceConnected : "+ isDeviceConnected);
if(!isDeviceConnected)
throw new Exception("whatever"); // TODO : Chercher vrai erreur

return awRepository.getFluxAuthenticate(host, port, user, password); // Single<DisfeApiAirWatch>
})
.toObservable()
.flatMap(awRepository::getFluxManagedApps) // List of apps : Observable<AirwatchApp>

.observeOn(AndroidSchedulers.mainThread())
.doFinally(this::hideProgressDialog)
.subscribe(
app -> Log.i("LOG", "OnNext : "+ app),
error -> Log.i("LOG", "Error : " + error),
() -> Log.i("LOG", "Complete : ")
);

但是,对于一个简单的“如果”发出一个 bool 值的单例听起来是错误的。 Completable 似乎更合乎逻辑(工作与否,继续或停止)。我尝试使用以下代码,但它不起作用。

Completable.create((CompletableEmitter e) -> {
if(Connectivity.isDeviceConnected(MainActivity.this))
e.onComplete(); // Guess not good, should call the complete of subscribe ?
else
e.onError(new Exception("whatever"));
} ).toObservable()
.subscribeOn(Schedulers.io())
.flatMap(awRepository.getFluxAuthenticate(host, port, user, password)) //Single<DisfeApiAirWatch>
.toObservable()
.flatMap(awRepository::getFluxManagedApps) // List of apps : Observable<AirwatchApp>

.observeOn(AndroidSchedulers.mainThread())
.doFinally(this::hideProgressDialog)
.subscribe(
app -> Log.i("LOG", "OnNext : "+ app),
error -> Log.i("LOG", "Error : " + error),
() -> Log.i("LOG", "Complete : ")
);

如何使这段代码工作?

我知道我可以在 complatable 上做一个第一次订阅,并在这个的“onSuccess”中写另一个通量/代码的其余部分。但我不认为堆栈在彼此内部流动是一个好的解决方案。

最好的问候

最佳答案

Completable 没有值,所以 flatMap 永远不会被调用。您必须使用 andThen 并将身份验证成功值作为后续 flatMap 的输入:

Completable.create((CompletableEmitter e) -> {
if(Connectivity.isDeviceConnected(MainActivity.this))
e.onComplete();
else
e.onError(new Exception("whatever"));
})
.subscribeOn(Schedulers.io())
.andThen(awRepository.getFluxAuthenticate(host, port, user, password)) // <-----------
.flatMapObservable(awRepository::getFluxManagedApps)
.observeOn(AndroidSchedulers.mainThread())
.doFinally(this::hideProgressDialog)
.subscribe(
app -> Log.i("LOG", "OnNext : "+ app),
error -> Log.i("LOG", "Error : " + error),
() -> Log.i("LOG", "Complete : ")

);

关于android - 如何连续执行多个 RxJava2 flux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com