Java LiveData没有';最初不显示数据

Java LiveData没有';最初不显示数据,java,android,android-architecture-components,android-livedata,android-viewmodel,Java,Android,Android Architecture Components,Android Livedata,Android Viewmodel,我正在从我的服务器获取一些数据,并使用LiveData对其进行观察。当我的片段最初启动时,它不会返回onChanged()中的任何内容,在切换片段后,它会使用正确的数据触发onChanged() 调试之后,我看到我的API调用成功了,我在那里得到了数据,但最初它并没有通过onChanged()返回数据 存储库: public class UserRepository { private ApiService apiService; private static UserRepos

我正在从我的服务器获取一些数据,并使用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();
            }
        });
    }
}
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()
来解决这个问题。但这并不是谷歌所说的首选方法,也是一种变通方法。

正如评论中所提到的,在设置fetchUser()中的任何值之前,您似乎都在存储库中调用了getUser()。更改fetchUser(),使其返回LiveData,然后从视图模型而不是getUser()调用该方法:


请尝试使用
setValue()
方法,而不是
postValue()
。@JeelVankhede无法在片段中共享您的设置吗?@JeelVankhede我已编辑了片段代码。我在
onCreateView()
中调用它,在片段中在哪里调用
fetchUser()
方法?可能你是在观察数据后才调用它的,这就是为什么你会被延迟观察的原因!
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();
}