Android MVVM / Repository, как заставить LiveData обновляться из репозитория? - PullRequest
0 голосов
/ 24 апреля 2020

вот моя проблема:

Я использовал шаблон проектирования MVVM / Repository, как это:

Activity - (Наблюдения) -> LiveData ViewModel -> Repository -> API WebService (GET Resource) )

у меня есть другие вызовы для ОБНОВЛЕНИЯ Ресурса для WebService.

Проблема:

после изменения ресурса на сервер. как я могу сделать Resource Liveata для обновления себя новыми данными серверов

Я хочу заставить его снова получать данные с сервера, потому что некоторые другие данные могли быть изменены. и я не хочу использовать локальную базу данных (Room) и менять ее, потому что данные моего сервера могут быть изменены. и они должны извлекать каждый раз.

Единственное решение, которое передал мне в голову, - это создать для него источник Livedata (как dataVersion). и увеличивайте его после каждого обновления, как это (псевдокод):

dataVersion = new MutableLiveData();
dataVersion.setValue(0);
// my repository get method hasnt anything to do with the dataVersion.
myData = Transformation.switchmap(dataVersion, versionNum -> { WebServiceRepo.getList() });

и как dataVersion должен обновляться во ViewModel.

1 Ответ

0 голосов
/ 30 апреля 2020

Вы можете расширить MutableLiveData, чтобы дать ему функцию ручной выборки.

public class RefreshLiveData<T> extends MutableLiveData<T> {
    public interface RefreshAction<T> {
        private interface Callback<T> {
             void onDataLoaded(T t);
        }

        void loadData(Callback<T> callback);
    }

    private final RefreshAction<T> refreshAction;
    private final Callback<T> callback = new RefreshAction.Callback<T>() {
          @Override
          public void onDataLoaded(T t) {
               postValue(t);
          }
    };

    public RefreshLiveData(RefreshAction<T> refreshAction) {
        this.refreshAction = refreshAction;
    }

    public final void refresh() {
        refreshAction.loadData(callback);
    }
}

Затем вы можете сделать

public class YourViewModel extends ViewModel {
    private RefreshLiveData<List<Project>> refreshLiveData;

    private final GithubRepository githubRepository;
    private final SavedStateHandle savedStateHandle;

    public YourViewModel(GithubRepository githubRepository, SavedStateHandle savedStateHandle) {
         this.githubRepository = githubRepository;
         this.savedStateHandle = savedStateHandle;

         refreshLiveData = Transformations.switchMap(savedStateHandle.getLiveData("userId", ""), (userId) -> {
             githubRepository.getProjectList(userId);
         });
    }

    public void refreshData() {
        refreshLiveData.refresh();
    }

    public LiveData<List<Project>> getProjects() {
        return refreshLiveData;
    }
}

И тогда репозиторий может сделать:

public RefreshLiveData<List<Project>> getProjectList(String userId) {
    final RefreshLiveData<List<Project>> liveData = new RefreshLiveData<>((callback) -> {
         githubService.getProjectList(userId).enqueue(new Callback<List<Project>>() {
            @Override
            public void onResponse(Call<List<Project>> call, Response<List<Project>> response) {
                callback.onDataLoaded(response.body());
            }

            @Override
            public void onFailure(Call<List<Project>> call, Throwable t) {

            }
         });
    });

    return liveData;
}
...