我有一个执行网络请求并返回带有可变数据类列表的 Observable 的方法。有时此方法会因 403 错误而失败。我需要调用 YouTubeClient.getApiKey() 方法来获取新的 Api 密钥并重复对网络的请求。怎么做?我阅读了很多类似的主题,但没有找到可行的决定。
实用方法的这段代码,当我尝试调用 retryWhen() 方法时
private fun searchRequestWrapper(query: String): Observable<MutableList<Video>> {
return youTubeClient.searchRequest(
YouTubeClient.URL_SNIPPET,
YouTubeClient.MAX_RESULT, query,
YouTubeClient.API_KEY
)
.retryWhen { errors -> errors
.zipWith(Observable.range(1, 3)) { error, a ->
YouTubeClient.getApiKey()
error
}
}
.map {it.items}
}
Main 方法在下面调用自身内部的实用程序方法
fun fetchVideos(query:String) {
_networkState.set(NetworkState.LOADING)
Log.e("NetworkState", networkState.get()?.status.toString())
try {
compositeDisposable.add(
searchRequestWrapper(query)
.flatMapIterable {it}
.flatMap { video -> videoInfoWrapper(video.videoId).subscribeOn(Schedulers.io()) }
.toList()
.subscribeOn(Schedulers.io())
.subscribe({
Log.e("new videosId",it.toString())
downloadedVideosList.postValue(it)
_networkState.set(NetworkState.LOADED)
Log.e("NetworkState", networkState.get()?.status.toString())
_networkState.set(NetworkState.WAITING)
Log.e("NetworkState", networkState.get()?.status.toString())
},{
errorHandle(it)
}))
}
catch (e: Exception){
Log.e("fetchVideos",e.message)
}
}