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。