【发布时间】:2019-03-16 01:04:32
【问题描述】:
我正在开发一个使用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()))
}
在我的视图模型中:
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)
如您所见,我正在考虑在活动中处理它,但我仍然对此感到困惑。任何帮助将非常感激。谢谢!
【问题讨论】:
-
stackoverflow.com/questions/52257744/… 在这个答案中是工作代码,我在不同的项目中使用过
标签: android mvvm retrofit rx-java android-livedata