Не обрабатывать сеть в rxjava с модернизацией - PullRequest
0 голосов
/ 11 октября 2018

Я занимаюсь разработкой приложения, которое выполняет сетевой запрос с использованием retrofit2 и rxjava2.Я делаю это с использованием подхода MVVM, который в моем RestInterface является результатом запроса, возвращаемого в Flowable, и в моем репозитории я конвертирую Flowable в liveata, чтобы я мог заставить действие наблюдать его в моей модели представления.Но, сделав это, я запутался в том, как справиться, если нет сети, в которой я обычно обрабатываю это на стороне 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)

Как вы можете видеть, я думал об этом в упражнении, но все же запутался.Любая помощь приветствуется.спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете попробовать добавить 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)
        }
    }
}

Затем вы можете проверить, есть ли ошибка в сети

...