üzerinde gözle görülebilir olan yeniden deneyin Ağ isteklerini senkronize olmayan şekilde ele almak için Android uygulamasında rxAndroid ve rxKotlin kullanıyorum. Artık, başarısız bir ağ isteğini yalnızca Snackbar düğmesine tıkladıktan sonra tekrar denemek istiyorum. ŞimdiRxAndroid -
Kodum:
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 fabrikasında:
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()
}
Nasıl böyle bir şekilde gözlemlenebilir yeniden başlatabilirsiniz retrofit için
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()
}
Şehirler arayüzü?
Bir isteği tetikleyen nedir? Bunu senin kodundan göremiyorum. '' Şehirler() 'yi çağırmak yeni bir istek tetikliyor mu? –
Yukarıda daha fazla kod ekledim. Evet, 'şehirler()' yeni bir isteği tetikler – Michael
Ardından, tüm şehirlerService.cities() ... 'reaktif zincirini yeni bir yöntemle paketleyebilir ve bunu Snackbar'ın eylem dinleyicisinden arayabilirsin. –