Как установить связь между репозиторием и классом ViewModel, когда Retrofit не удается или успешно выполняет запросы? - PullRequest
2 голосов
/ 21 января 2020

В течение многих лет я разрабатывал Android приложений с шаблоном MVP, но сейчас я пытаюсь выучить MVVM с ViewModel и LiveData

. В следующем примере я не понимаю, как я могу сообщить о неудачном или успешном результате по запросу POST или GET с Retrofit

До этого с MVP я бы использовал Слушатель для связи докладчика с listener.onTodoFetched() или listener.onTodoFetchError() и затем реагирует по-разному в зависимости от того, какой метод вызывается. Должен ли я по-прежнему общаться таким образом с моим ViewModel классом?

FetchTodoRepository. java

public MutableLiveData<String> fetchTodo() {
    retrofitService.getRetrofitService().create(Endpoints.class).getTodo().enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {

            if (response.isSuccessful() && response.body() != null) {
                listener.onTodoFetched(response.body());     //ViewModel equivalent?
            } else {
                listener.onTodoFetchError(response.message());     //ViewModel equivalent?
            }

        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
            listener.onTodoFetchError(t.getMessage());     //ViewModel equivalent?
        }
    });

    return mutableLiveData;
}

ОБНОВЛЕНИЕ:

На основании ответов и дальнейших исследований можно использовать следующие методы:

  • Простой Java слушатель между классами
  • Rx Java
  • Kotlin Функции высшего порядка.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Когда вы используете mvvm с livingata, вам действительно не нужно использовать интерфейс для передачи данных в viewmodel.

MutableLiveData имеет метод setValue (), передающий ваш ответ, а затем, когда вы вызовете этот метод fetchTodo () в viewmodel, вы получите все свои данные.

Попробуйте код ниже

  public MutableLiveData<String> fetchTodo() {
retrofitService.getRetrofitService().create(Endpoints.class).getTodo().enqueue(new 
Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {

        if (response.isSuccessful() && response.body() != null) {
            mutableLiveData.setValue(response.body())
        } else {
             mutableLiveData.setValue(response.message());    
        }

    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
         mutableLiveData.setValue(t.message());    //ViewModel equivalent?
    }
});

return mutableLiveData;
}

По вашему мнению модель:

 public LiveData<String> fetchTodo()
{
 return yourRepoInstance.fetchTodo() ; here you will get result data
}
0 голосов
/ 22 января 2020

Связь между репозиторием и ViewModel с использованием Высшие функции Одера Передача функции в качестве аргумента в метод репозитория

Например, в методе репозитория, например:

fun repoMethod(id : Int, viewModelCallBack : (List<CustomeDto>) -> Unit)
{
     //Your API call
     .....
    viewModelCallBack(response.body())

}

И Посмотреть модель метода, как

    fun viewModelMethod()
    {
       repoObj.repoMethod(5){ listOfValueReturnFromApi ->
            //Here listOfValueReturnFromApi is API response using Higher Order function in kotlin
        }

    }
...