Обновление данных с помощью refreshLayout с использованием livingata - PullRequest
1 голос
/ 03 октября 2019

У меня есть фрагмент в моем приложении, в котором я показываю два списка данных saparate. Я использую из компонентов архитектуры Android для загрузки своих данных. Когда данные извлекаются из сети, я сохраняю их локально, используя Room DB, а затем отображаю их в пользовательском интерфейсе, используя ViewModel, который наблюдает за объектом LiveData (это прекрасно работает). Тем не менее, я хочу иметь возможность refreshLayout, который при обновлении происходит действие обновления и выполнить сетевой запрос для получения новых данных из API, если и только если есть сетевое подключение. Проблема заключается в том, что при обновлении происходит загрузка данных из locateБаза данных и сеть вместе. мой вопрос: Как мне удается получать данные только из сети при обновлении данных?

Как мне удается получать данные только из сети при обновлении данных? Я видел этот вопрос , и он мне не помог ...

мои коды:

хранилище:

    public NetworkResult<LiveData<HomeHealthModel>> getHomeHealth(String query) {

    MutableLiveData<String> _liveError = new MutableLiveData<>();
    MutableLiveData<HomeHealthModel> data = new MutableLiveData<>();


    LiveData<List<GeneralItemModel>> liveClinics = App.getDatabase().getGeneralItemDAO().getTops(GeneralItemType.Clinics, GeneralItemType.TOP);
    LiveData<List<GeneralItemModel>> liveDoctors = App.getDatabase().getGeneralItemDAO().getTops(GeneralItemType.Doctors, GeneralItemType.TOP);

    setupService(_liveError); //request data from network


    data.postValue(new HomeHealthModel(liveClinics, liveDoctors));
    _liveError.postValue(String.valueOf(NetworkResponseType.LocaleData));
    return new NetworkResult<>(_liveError, data);

}

my viewModel

public class HomeHealthVM extends ViewModel {

private MutableLiveData<String> queryLiveData;

private LiveData<String> networkErrors;
private LiveData<List<GeneralItemModel>> Clinics;
private LiveData<List<GeneralItemModel>> Doctors;

public HomeHealthVM(HealthRepository repository) {
    queryLiveData = new MutableLiveData<>();

    LiveData<NetworkResult<LiveData<HomeHealthModel>>> repoResult;
    repoResult = Transformations.map(queryLiveData, repository::getHomeHealth);
    LiveData<HomeHealthModel> model = Transformations.switchMap(repoResult, input -> input.data);
    Doctors = Transformations.switchMap(model, HomeHealthModel::getDoctors);
    Clinics = Transformations.switchMap(model, HomeHealthModel::getClinics);
    networkErrors = Transformations.switchMap(repoResult, input -> input.error);
}

public void search(String queryString) {
    queryLiveData.postValue(queryString);
}


public String lastQueryValue() {
    return queryLiveData.getValue();
}

public LiveData<String> getNetworkErrors() {
    return networkErrors;
}

public LiveData<List<GeneralItemModel>> getClinics() {
    return Clinics;
}

public LiveData<List<GeneralItemModel>> getDoctors() {
    return Doctors;
}

}

my фрагмент код:

    private void setupViewModel() {

    ViewModelFactory<HealthRepository> factory = new ViewModelFactory<>(new HealthRepository());
    healthVM = ViewModelProviders.of(this, factory).get(HomeHealthVM.class);

    healthVM.getNetworkErrors().observe(this, states -> {


        try {
            if (Integer.parseInt(states) != WarningDialogType.Success &&
                    Integer.parseInt(states) != WarningDialogType.Locale) {
                stopLoading();
                linerNoInternet.setVisibility(View.VISIBLE);
                linerContent.setVisibility(View.GONE);
            }
        } catch (Exception e) {
            stopLoading();
            linerNoInternet.setVisibility(View.VISIBLE);
            linerContent.setVisibility(View.GONE);
        }
    });

    healthVM.getDoctors().observe(this, doctors -> {

        if (doctors.size() > 0) {
            doctorsAdapter.submitList(doctors);
            stopLoading();
        } else {
        }
    });

    healthVM.getClinics().observe(this, clinics -> {
        if (clinics.size() > 0) {
        clinicsAdapter.submitList(clinics);

            stopLoading();
        } else {
            conesClinics.setVisibility(View.GONE);

        }
    });

    healthVM.search("");
}
...