LiveData не показывает данные изначально - PullRequest
0 голосов
/ 04 декабря 2018

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

После отладки я увидел, что мой вызов API успешен, и я получаю данные там, но изначально он не возвращает данные через onChanged().

Репозиторий:

public class UserRepository {
    private ApiService apiService;
    private static UserRepository repository;
    private MutableLiveData<User> user = new MutableLiveData<>();

    private UserRepository() {
        apiService = RestClient.getClient().create(ApiService.class);
    }

    public synchronized static UserRepository getInstance() {
        if (repository == null) repository = new UserRepository();
        return repository;
    }

    public LiveData<User> getUser() {
        return user;
    }

    public void fetchUser() {
        Call<User> call = apiService.getUser();
        call.enqueue(new Callback<User>() {
            @Override
            public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
                if (response.body() != null) user.postValue(response.body());
            }

            @Override
            public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
                user.postValue(null);
                t.printStackTrace();
            }
        });
    }
}

ViewModel:

public class UserViewModel extends AndroidViewModel {
    private LiveData<User> user;

    public UserViewModel(@NonNull Application application) {
        super(application);
        user = UserRepository.getInstance().getUser();
    }

    public LiveData<User> getUser() {
        return user;
    }
}

Фрагмент:

userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
userViewModel.getUser.observe(this, user -> {
    //Set data
})

Я могу решить эту проблему, позвонив UserRepository.getInstance().getUser() перед наблюдением в моем фрагменте.Но это не предпочтительный метод, как говорит Google, а своего рода обходной путь.

1 Ответ

0 голосов
/ 04 декабря 2018

Как уже упоминалось в комментариях, вы, кажется, вызываете getUser () для хранилища, прежде чем даже установить какое-либо значение в fetchUser ().Измените fetchUser () так, чтобы он возвращал LiveData, а затем вызовите этот метод из модели представления вместо getUser ():

public LiveData<User> fetchUser() {
    Call<User> call = apiService.getUser();
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
            if (response.body() != null) user.postValue(response.body());
        }

        @Override
        public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
            user.postValue(null);
            t.printStackTrace();
        }
    });

    return user;
 }

А затем в модели представления:

public UserViewModel(@NonNull Application application) {
    super(application);
    user = UserRepository.getInstance().fetchUser();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...