Я получаю некоторые данные с моего сервера и наблюдаю их с помощью 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, а своего рода обходной путь.