Java LiveData没有';最初不显示数据
我正在从我的服务器获取一些数据,并使用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
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();
}