RxAndroid – 重试观察点击
我在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() }
我怎样才能以这种方式重新启动observable?
我可以建议你真正的被动的方式,而不是命令的方式。
在subscribe()方法之后插入此代码:
.retryWhen(retryHandler -> retryHandler.flatMap(nothing -> retrySubject.asObservable())) .subscribe()
哪里更新主题只是:
@NonNull private final PublishSubject<Void> retrySubject = PublishSubject.create();
在小吃店点击打电话给这个方法:
public void update() { retrySubject.onNext(null); }
retryWhen方法的所有内容都将重新进行。
虽然用这种方法,错误永远不会下到用户,但是你可以在retryHandler平面地图上添加错误处理,但这是另一回事。
PS抱歉,这是与retrolambdas Java代码,但你会很容易地将其转换为Kotlin。