AndroidアプリケーションでrxAndroidとrxKotlinを使用してネットワーク要求を非同期に処理しています。今すぐスナックバーボタンをクリックした後で失敗したネットワークリクエストを再試行したいと思います。RxAndroid - クリック時に観測再試行
私のコード今:
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()
}
私は、このような方法で観測可能を再起動することができますどのように?
リクエストをトリガしているのは何ですか?私はあなたのコードからそれを見ることはできません。 'cities()'を呼び出すと新しいリクエストがトリガされますか? –
上記のコードを追加しました。はい、 'cities()'が新しいリクエストを引き起こします – Michael
次に、 'citiesService.cities()...'リアクティブチェーンを新しいメソッドにラップして、Snackbarのアクションリスナーから呼び出すことができます。 –