翻新处理rxjava中的无网络

时间:2018-10-11 03:29:10

标签: android mvvm retrofit rx-java android-livedata

我正在开发一个使用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)

如您所见,我当时正在考虑在活动中处理它,但我对此仍然感到困惑。任何帮助将非常感激。谢谢!

1 个答案:

答案 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)
        }
    }
}

然后您可以检查网络中是否存在错误