我正在开发一个使用Retrofit2和rxjava2进行网络请求的应用程序。我正在使用MVVM方法执行此操作,这是在我的RestInterface中Flowable返回的请求的结果,在我的存储库中,我将Flowable转换为livedata,以便可以使活动在我的视图模型中进行观察。但是通过这样做,如果在rxJava端通常没有网络可以正常处理这个问题,我就感到困惑,但是由于它位于存储库中,因此我无法对此做很多事情。
以下是其余代码:
@GET(NEWS_ARTICLE)
fun getArticlesFromSources(@Query("domains") source: String,
@Query("apiKey") apiKey: String = BuildConfig.NEWS_API_KEY):
Flowable<NewsResponse>
存储库代码
fun getArticleFromSources(source: String) : LiveData<NewsResponse>{
return LiveDataReactiveStreams.fromPublisher(newsRest.getArticlesFromSources(source)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()))
}
在我的viewmodel中:
private var mTriggerFetchData = MutableLiveData<String>()
private val article: LiveData<NewsResponse> = Transformations.switchMap(mTriggerFetchData){
newsRepository.getArticleFromSources(it)
}
fun getArticle() = article
fun loadArticle(source: String?){
mTriggerFetchData.value = source
}
我在“活动”中看到了它:
getViewModel().getArticle().observe(this, Observer {newsResponse ->
Log.v("test", newsResponse?.articles?.size.toString())
articleList?.clear()
newsResponse?.articles?.let { articleList?.addAll(it) }
articleAdapter.notifyDataSetChanged()
})
getViewModel().loadArticle(sourceUrl)
如您所见,我当时正在考虑在活动中处理它,但我对此仍然感到困惑。任何帮助将非常感激。谢谢!
答案 0 :(得分:0)
您可以尝试将onErrorReturn()
添加到链中
fun getArticleFromSources(source: String) : LiveData<NewsResponse>{
return LiveDataReactiveStreams.fromPublisher(newsRest.getArticlesFromSources(source)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.onErrorReturn((e: Throwable) -> {
return e
})
}
或者,您可以将对象和错误包装到可以容纳错误的包装器类中,而不是仅通过NewsResponse
对象公开LiveData
。
您可以执行以下操作:
LiveDataReactiveStreams.fromPublisher(newsRest.getArticlesFromSources(source)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()
.map(Result::success)
.onErrorReturn(Result::error))
在Result
类中包含错误或结果的地方是这样的
class Result<T>(val data: T?, val error: Throwable?) {
companion object {
fun <T> success(data: T): Result<T> {
return Result(data, null)
}
fun <T> error(error: Throwable): Result<T> {
return Result(null, error)
}
}
}
然后您可以检查网络中是否存在错误