【问题标题】:Handle no network in rxjava with retrofit通过改造处理 rxjava 中的无网络
【发布时间】: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)

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

【问题讨论】:

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


【解决方案1】:

您可以尝试将onErrorReturn()添加到链中

fun getArticleFromSources(source: String) : LiveData<NewsResponse>{
    return LiveDataReactiveStreams.fromPublisher(newsRest.getArticlesFromSources(source)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.io())
        .onErrorReturn((e: Throwable) -> {
            return e
        })
}

或者,除了通过 LiveData 对象公开 NewsResponse 之外,您还可以将对象和错误包装到可以容纳错误的包装类中。

你可以这样做:

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

然后您可以检查是否有来自网络的错误

【讨论】:

  • 谢谢你的回答,我会努力实现的。
猜你喜欢
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2017-05-13
  • 1970-01-01
  • 2014-04-18
相关资源
最近更新 更多