Как обработать исключение в Mvvm Android и передать это исключение на наш взгляд - PullRequest
0 голосов
/ 07 февраля 2019

Я использую архитектуру 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;

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете обернуть свой класс Bean в класс Generic Resource и наблюдать его.Google упомянул об этом в своих документах:

public class Resource<T> {
@NonNull public final Status status;
@Nullable public final T data;
@Nullable public final String message;
private Resource(@NonNull Status status, @Nullable T data,
        @Nullable String message) {
    this.status = status;
    this.data = data;
    this.message = message;
}

public static <T> Resource<T> success(@NonNull T data) {
    return new Resource<>(Status.SUCCESS, data, null);
}

public static <T> Resource<T> error(String msg, @Nullable T data) {
    return new Resource<>(Status.ERROR, data, msg);
}

public static <T> Resource<T> loading(@Nullable T data) {
    return new Resource<>(Status.LOADING, data, null);
}

public enum Status { SUCCESS, ERROR, LOADING }
}

Больше можно найти здесь: Документы Google

Сделайте так:

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

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

Теперь аналогично наблюдайте в вашем классе ViewModel Bean, обернутом в Resource.Обрабатывать успех и ошибку в соответствии с классом ресурсов Состояние

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...