обработка исключений через mvvm android - PullRequest
0 голосов
/ 23 ноября 2018

Я использую архитектуру MVVM, чтобы поразить веб-сервис через модернизацию в Android Studio.Я обработал ответ службы в своем классе просмотра.Но проблема, с которой я сталкиваюсь, заключается в том, как обрабатывать исключения и передавать их в мой класс просмотра.Один из способов - создать конструктор в моем классе Bean, передать ему ответ и ошибку и обновить пользовательский интерфейс.Но я хочу более оптимизированный способ обработки исключений внутри пользовательского интерфейса.

Вот мой код хранилища:

final MutableLiveData<MyBeanClass> myBeanClass = new MutableLiveData<>();
   ApiInterface apiInterface = ApiClient.getClientAuthentication().create(ApiInterface.class);
    Call<MyBeanClass> call = apiInterface.getData(id);
    call.enqueue(new Callback<MyBeanClass>() {
        @Override
        public void onResponse(Call<MyBeanClass> call, Response<MyBeanClass> response) {
            if(response.body()!=null) {
                myBeanClass.setValue(response.body());
            }
        }

        @Override
        public void onFailure(Call<MyBeanClass> call, Throwable t) {
         //How to handle exceptions here and pass the exception to UI without making constructor in bean class
        }
    });

    return myBeanClass;

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вместо создания двух изменяемых классов.Вы можете просто создать объект-оболочку для состояния ошибки и успеха или даже для состояния загрузки

data class Resource<out T>(val status: Status, val data: T?, val message: String?) {
    companion object {
        fun <T> success(data: T?): Resource<T> {
            return Resource(SUCCESS, data, null)
        }

        fun <T> error(msg: String, data: T?): Resource<T> {
            return Resource(ERROR, data, msg)
        }

        fun <T> loading(data: T?): Resource<T> {
            return Resource(LOADING, data, null)
        }
    }
}

, а затем использовать данные MutableLive в качестве этого типа

final MutableLiveData<Resource<MyBeanClass>> myBeanClass = new MutableLiveData<>();
           ApiInterface apiInterface = ApiClient.getClientAuthentication().create(ApiInterface.class);
            Call<MyBeanClass> call = apiInterface.getData(id);
            call.enqueue(new Callback<MyBeanClass>() {
                @Override
                public void onResponse(Call<MyBeanClass> call, Response<MyBeanClass> response) {
                    if(response.body()!=null) {
                    myBeanClass.setValue(Resource<MyBeanClass>.success(response.body));
                    }
                }

                @Override
                public void onFailure(Call<MyBeanClass> call, Throwable t) {
     myBeanClass.setValue(Resource<MyBeanClass>.error(t.getLocalizedMessage()));
                }
            });

            return myBeanClass;

Вы можете проверить этот пример Googlehttps://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample

0 голосов
/ 20 апреля 2019

Вы можете подключиться здесь.Вызовите метод интерфейса из onFailure и предоставьте реализацию этого интерфейса со стороны пользовательского интерфейса, чтобы при возникновении ошибки вы были на стороне вашего пользовательского интерфейса

0 голосов
/ 23 ноября 2018

Проверьте, как это можно сделать из кода репозитория:

//Take it globally in your repository class, and provide getter for it.
final MutableLiveData<MyBeanClass> myBeanClass = new MutableLiveData<>();
final MutableLiveData<Throwable> error = new MutableLiveData<>();

public void someApiCallMethod() {
    // In your method call for API
    ApiInterface apiInterface = 
    ApiClient.getClientAuthentication().create(ApiInterface.class);
    Call<MyBeanClass> call = apiInterface.getData(id);
    call.enqueue(new Callback<MyBeanClass>() {
        @Override
        public void onResponse(Call<MyBeanClass> call, Response<MyBeanClass> response) {
            if(response.body()!=null) {
                myBeanClass.setValue(response.body());
            }
            // Even you can handle your response error if it's in your response.
        }

        @Override
        public void onFailure(Call<MyBeanClass> call, Throwable t) {
            //Set your error live data from here
            error.setValue(t);
        }
    });
}

Из вашего ViewModel класса создайте метод, который вызывает ваш метод API репо, а другой - для предоставления ваших живых данных, которые нужно наблюдатьна вашем интерфейсе.

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

...