我有一个方法来执行网络请求并返回可变数据类列表的可观察数据。有时此方法失败,出现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}
}
下面是调用自身内部实用方法的主要方法
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)
}
}
1条答案
按热度按时间wn9m85ua1#
这个解决方案怎么样?
事实上你用的是retrywhen错误。retrywhen操作符只是发出是否应该重试的信号。每次内部可观察对象发出一个值时,就会开始重试。
在我的示例中,通过onerrorresumnext捕获403异常,该异常捕获onerror发出并订阅可观察的回退。retrywhen after此运算符确保其他错误将重试3次。
仅供参考:每个运算符转换日期只能在不可变数据中工作,因此应避免使用可变列表。