LiveData 最初不显示数据
LiveData doesn't show data initially
我正在从我的服务器获取一些数据并使用 LiveData 观察它。当我的片段最初开始时,它不会 return onChanged()
中的任何内容,并且在切换片段后,它会使用正确的数据触发 onChanged()
。
调试后,我看到我的 API 调用成功了,我在那里获取了数据,但最初并不是 return 通过 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 所说的首选方法,而是一种解决方法。
正如评论中已经提到的,您似乎甚至在设置 fetchUser() 中的任何值之前就在存储库上调用了 getUser()。更改 fetchUser() 使其 returns 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();
}
我正在从我的服务器获取一些数据并使用 LiveData 观察它。当我的片段最初开始时,它不会 return onChanged()
中的任何内容,并且在切换片段后,它会使用正确的数据触发 onChanged()
。
调试后,我看到我的 API 调用成功了,我在那里获取了数据,但最初并不是 return 通过 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 所说的首选方法,而是一种解决方法。
正如评论中已经提到的,您似乎甚至在设置 fetchUser() 中的任何值之前就在存储库上调用了 getUser()。更改 fetchUser() 使其 returns 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();
}