Обработка ошибок Rx java в mvvm с помощью модернизации - PullRequest
1 голос
/ 11 февраля 2020

Я вызываю один API, который дает Http код состояния 400

Это мой NetworkBoundResourceNoDb

public abstract class NetworkBoundResourceNoDb<RequestType> {

    private Observable<Resource<RequestType>> result;

    @MainThread
    protected NetworkBoundResourceNoDb() {
        Observable<Resource<RequestType>> source;
        source = createCall()
            .subscribeOn(Schedulers.io())
            .doOnError(t -> onFetchFailed())
            .observeOn(AndroidSchedulers.mainThread());

        result = Observable.ambArray(source);
    }


    public Observable<Resource<RequestType>> getAsObservable() {return result;}

    protected boolean onFetchFailed() {
        return false;
    }


    @NonNull
    @MainThread
    protected abstract Observable<Resource<RequestType>> createCall();
}

Это код API

@GET("api/content/count")
Observable<List<WordCountData>> wordCount();

Это функция хранилища

    fun wordCount(): Observable<Resource<List<WordCountData>>>? {
    return object : NetworkBoundResourceNoDb<List<WordCountData>>() {

        override fun createCall(): Observable<Resource<List<WordCountData>>> {
            return courseApi.wordCount()
                .flatMap { learntWords ->
                    Observable.just(
                        if (learntWords == null) Resource.error("", emptyList())
                        else Resource.success(learntWords)
                    )
                }
        }

    }.asObservable
}

Это код модели представления

private var wordCount = MutableLiveData<Resource<List<WordCountData>>>()

fun getWordCountLiveData() = wordCount

fun getWordCountList() {
    courseRepository.wordCount()?.subscribe { resource -> getWordCountLiveData().postValue(resource) }
}

Это мой код просмотра

private fun loadWordCount() {
    crViewModel = ViewModelProviders.of(this, viewModelFactory).get(CrViewModel::class.java)
    crViewModel.getWordCountLiveData().observe(this, androidx.lifecycle.Observer {
        resource -> when {
        resource.isLoading -> println("loading")
        resource.data != null -> {
            drawChart(resource.data)
        }
        else -> handleErrorResponse()
    }
    })
    crViewModel.getWordCountList()
}

Мне нужно передать код статуса Http для просмотра. я могу получить ошибку в onFetchfailed в хранилище при реализации его с параметром throwable, но не могу обработать его после этого

Пожалуйста, помогите мне спасибо заранее

1 Ответ

1 голос
/ 11 февраля 2020

человек, вы задаете много вопросов в 1.

fun getWordCountList() {
courseRepository.wordCount()?.subscribe { resource -> getWordCountLiveData().postValue(resource) }
}

Это кусок кода, который запускает весь ваш другой сетевой код. Однако эта лямбда имеет только параметр успеха, а не параметр ошибки. Добавьте вторую лямбду и окружите ее парантезом, чтобы учесть как успехи, так и неудачи:

.subscribe({
    successResponse -> // handle success
}, 
{ error -> // handle error
})

, так что следует по крайней мере позаботиться об «OnErrorNotImplementedException»

Ошибка 400 обычно означает, что ваш запрос недействителен, и / или вы передаете неправильный набор параметров для вашего запроса. Я не могу помочь вам с количеством информации, которую вы нам дали, и ничего не зная о вашем сервере.

Наконец: «Мне нужно передать код статуса Http для просмотра». Какая?? Почему? В вашем названии даже упоминается архитектура! Почему ваш уровень представления даже заботится о коде ответа от сетевого вызова ??

Не делайте этого. Конечно, ваше представление может знать код ответа, но это то, о чем слой представления вообще не должен знать.

Надеюсь, это поможет.

...