gpt4 book ai didi

android - RxAndroid - 点击重试观察

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:01 26 4
gpt4 key购买 nike

我在我的 Android 应用程序中使用 rxAndroid 和 rxKotlin 来异步处理网络请求。现在我只想在单击 Snackbar 按钮后重试失败的网络请求。

我现在的代码:

val citiesService = ApiFactory.citiesService

citiesService.cities()
.subscribeOn(Schedulers.newThread()) // fetch List<String>
.flatMap { Observable.from(it) } // convert to sequence of String
.flatMap { city ->
citiesService.coordinates(city) // fetch DoubleArray
.map { City(city, it) } // convert to City(String, DoubleArray)
}
.toList()
.observeOn(AndroidSchedulers.mainThread())
.doOnNext {
listView.setOnItemClickListener { adapterView, view, position, id ->
onItemClick(it[position])
}
}
.map { it.map { it.getName(activity) } }
.subscribe(
{ listAdapter = setupAdapter(it) },
{ showErrorSnackbar() } // handle error
)

fun showErrorSnackbar() {
Snackbar.make(listView, getString(R.string.not_available_msg), Snackbar.LENGTH_INDEFINITE)
.setAction(getString(R.string.snack_retry_btn), {
// retry observable
})
.show()
}

用于改造的城市界面:

interface CitiesService {

@GET("api/v1/cities")
fun cities(): Observable<List<String>>

@GET("api/v1/cities/{city}/coordinates")
fun coordinates(@Path("city") city: String): Observable<DoubleArray>
}

API 工厂:

object ApiFactory {

val citiesService: CitiesService
get() = retrofit.create(CitiesService::class.java)

private val retrofit: Retrofit
get() = Retrofit
.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.build()
}

如何以这种方式重启可观察对象?

最佳答案

我可以建议您采用真正响应式(Reactive)的方式,而不是命令式的方式。

在 subscribe() 方法之后立即插入此代码:

.retryWhen(retryHandler -> 
retryHandler.flatMap(nothing -> retrySubject.asObservable()))
.subscribe()

更新主题是:

@NonNull
private final PublishSubject<Void> retrySubject = PublishSubject.create();

然后在 snackbar 上点击调用这个方法:

public void update() {
retrySubject.onNext(null);
}

retryWhen 方法之上的所有内容都将重做。

虽然使用这种方法错误永远不会传给订阅者,但您可以向 retryHandler 平面映射添加错误条件,但这是另一回事了。

附言抱歉,这是带有 retrolambda 的 Java 代码,但您可以轻松地将其转换为 Kotlin。

关于android - RxAndroid - 点击重试观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809467/

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