LiveData - не получают данные во фрагменте при втором вызове

Я использую LiveData для получения данных с сервера. В методе onResume, вызывая одну и ту же функцию каждые 5 секунд, я могу получать данные только при первом вызове API. Второй раз наблюдатель не запускается и не может получить данные во фрагменте.

это мой фрагмент:

    private int delay = 5 * 1000;
    private ViewModel mViewModel;
    private DetailsModel details = new DetailsModel();

    mViewModel = ViewModelProviders.of(this).get(ViewModel.class);
    mViewModel.getDetailsResponse("token", "ids");

    mViewModel.getData().observe(this, new Observer< DetailsModel >() {
                    @Override
                    public void onChanged(DetailsModel response) {

                        details = response;

                    }});
//getting data in every 5 seconds
@Override
    public void onResume() {
        super.onResume();

        liveHandler.postDelayed(runnable = new Runnable() {
            public void run() {
                mViewModel. getDetailsResponse("token", "ids");
                liveHandler.postDelayed(runnable, delay);
            }
        }, delay);
    }

ViewModel.java

 private MutableLiveData<DetailsModel> detailsResponse;
    private ProjectRepository repository  = new ProjectRepository();

    public void getDetailsResponse(String token, String ids) {
        detailsResponse = repository.getMapData("token", "ids");
    }

    public MutableLiveData<DetailsModel> getData() {
        return detailsResponse;
    }

ProjectRepository.java

public MutableLiveData<DetailsModel> getMapData(String token, String ids) {
        final MutableLiveData<DetailsModel> responseMutableLiveData = new MutableLiveData<>();

        Call<DetailsModel> call = service.getMapDetails(token, ids);
        call.enqueue(new Callback<DetailsModel>() {
            @Override
            public void onResponse(@NonNull Call<DetailsModel> call, @NonNull Response<DetailsModel> response) {
                responseMutableLiveData.postValue(response.body());
            }

            @Override
            public void onFailure(@NonNull Call<DetailsModel> call, @NonNull Throwable t) {
                t.printStackTrace();
            }
        });
        return responseMutableLiveData;
    }

person Yogesh Nikam    schedule 25.11.2019    source источник
comment
здесь проблема связана с вашим репозиторием, здесь вы вызываете postValue для другого объекта, однако вы добавили наблюдателя в другой объект   -  person Neha Rathore    schedule 25.11.2019
comment
проверить решение stackoverflow.com/questions/57209552/ для получения дополнительной информации   -  person Neha Rathore    schedule 25.11.2019


Ответы (2)


Каждый раз, когда вы вызываете getDetailsResponse, вы создаете новый объект LiveData, что является проблемой, вы должны сделать это в своем ProjectRepository

final MutableLiveData<DetailsModel> responseMutableLiveData = new MutableLiveData<>();

public MutableLiveData<DetailsModel> getMapData(String token, String ids) {
        Call<DetailsModel> call = service.getMapDetails(token, ids);
        call.enqueue(new Callback<DetailsModel>() {
            @Override
            public void onResponse(@NonNull Call<DetailsModel> call, @NonNull Response<DetailsModel> response) {
                responseMutableLiveData.postValue(response.body());
            }

            @Override
            public void onFailure(@NonNull Call<DetailsModel> call, @NonNull Throwable t) {
                t.printStackTrace();
            }
        });
        return responseMutableLiveData;
    }

И в вашей виртуальной машине:

private MutableLiveData<DetailsModel> detailsResponse = null;
private ProjectRepository repository  = new ProjectRepository();

public void getDetailsResponse(String token, String ids) {
        if (detailsResponse == null) {
           detailsResponse = repository.getMapData("token", "ids");
        } else {
           // Just call it, you already assigned before
           repository.getMapData("token", "ids");
        }
}

public MutableLiveData<DetailsModel> getData() {
        return detailsResponse;
}

Итак, в основном переместите создание объекта из самой функции. Однако дизайн вашей реализации MVVM можно значительно упростить. Я бы посоветовал проверить несколько примеров!

person Community    schedule 25.11.2019

Вы используете postDelayed() дважды, поэтому он не работает. Измените свой onResume() код на указанный ниже.

@Override
public void onResume() {
    super.onResume();

    liveHandler.postDelayed(runnable = new Runnable() {
        public void run() {
            mViewModel.getDetailsResponse("token", "ids");
            liveHandler.post(runnable);
        }
    }, delay);
}
person Kushal    schedule 25.11.2019