更新 ViewModel 数据?
Updating ViewModel Data?
我有一个 UserViewModel 负责获取用户信息,然后将其显示在 UI。
UserViewModel.java
public class UserViewModel extends ViewModel {
private MutableLiveData<UserResponse> userInfoMutableLiveData;
public MutableLiveData<UserResponse> getUserInfoMutableLiveData() {
if (userInfoMutableLiveData == null) {
userInfoMutableLiveData = new MutableLiveData<>();
fetchUserInfo();
}
return userInfoMutableLiveData;
}
private void fetchUserInfo() {
// Asynchronous call using RxJava to fetch user information.
}
我在UI中是这样调用的
ProfileFragment.java
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
return view;
}
这可以正确显示数据并且工作正常。
问题
当没有互联网连接时,我的应用程序会显示一个带有没有互联网连接警告的屏幕,然后是一个重试呼叫的按钮。
ProfileFragment.java
@Override
public void onRetryClick() {
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}
假设以下情况,我在没有互联网连接的情况下拨打电话 --> 显示重试按钮 --> 我重新连接到互联网,然后 --> 按重试按钮。
它会一直给我没有互联网连接的错误,因为它只是检索以前的 userInfoMutableLiveData
而不是加载新的。
我尝试了什么
我试过像这样获取UI中的用户信息。
ProfileFragment.java
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
viewModel.fetchUserInfo();
return view;
}
然后像这样调用onRetryClick()
。
ProfileFragment.java
@Override
public void onRetryClick() {
viewModel.fetchUserInfo();
}
它解决了这个问题,因为它会在我每次单击重试按钮时进行调用,但是,它失去了 ViewModel 的目的,即加载一次数据然后检索它。
我需要什么?
总之,我需要在没有互联网连接的情况下正确重试 ViewModel 调用。
在
@Override
public void onRetryClick() {
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}
您不应该重新观察实时数据,您应该使用 viewModel.fetchUserInfo();
重新发出请求。
你不需要重新观察它,因为它已经被观察到,你不需要在onCreateView
中调用viewModel.fetchUserInfo();
,因为它会自动获取你第一次打电话给 getUserInfoMutableLiveData
由于答案和评论对我有帮助,解决方案是将我正在做的两件事结合起来。
UserViewModel 应该保持不变,除了 fetchUserInfo()
必须是 public。
UserViewModel.java
public class UserViewModel extends ViewModel {
private MutableLiveData<UserResponse> userInfoMutableLiveData;
public MutableLiveData<UserResponse> getUserInfoMutableLiveData() {
if (userInfoMutableLiveData == null) {
userInfoMutableLiveData = new MutableLiveData<>();
fetchUserInfo();
}
return userInfoMutableLiveData;
}
public void fetchUserInfo() {
// Asynchronous call using RxJava to fetch user information.
}
您应该观察 onCreate()
中的 LiveData,然后在重新尝试加载或更新内容时调用它。
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
return view;
}
@Override
public void onRetryClick() {
viewModel.fetchUserInfo();
}
我有一个 UserViewModel 负责获取用户信息,然后将其显示在 UI。
UserViewModel.java
public class UserViewModel extends ViewModel {
private MutableLiveData<UserResponse> userInfoMutableLiveData;
public MutableLiveData<UserResponse> getUserInfoMutableLiveData() {
if (userInfoMutableLiveData == null) {
userInfoMutableLiveData = new MutableLiveData<>();
fetchUserInfo();
}
return userInfoMutableLiveData;
}
private void fetchUserInfo() {
// Asynchronous call using RxJava to fetch user information.
}
我在UI中是这样调用的
ProfileFragment.java
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
return view;
}
这可以正确显示数据并且工作正常。
问题
当没有互联网连接时,我的应用程序会显示一个带有没有互联网连接警告的屏幕,然后是一个重试呼叫的按钮。
ProfileFragment.java
@Override
public void onRetryClick() {
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}
假设以下情况,我在没有互联网连接的情况下拨打电话 --> 显示重试按钮 --> 我重新连接到互联网,然后 --> 按重试按钮。
它会一直给我没有互联网连接的错误,因为它只是检索以前的 userInfoMutableLiveData
而不是加载新的。
我尝试了什么
我试过像这样获取UI中的用户信息。
ProfileFragment.java
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
viewModel.fetchUserInfo();
return view;
}
然后像这样调用onRetryClick()
。
ProfileFragment.java
@Override
public void onRetryClick() {
viewModel.fetchUserInfo();
}
它解决了这个问题,因为它会在我每次单击重试按钮时进行调用,但是,它失去了 ViewModel 的目的,即加载一次数据然后检索它。
我需要什么?
总之,我需要在没有互联网连接的情况下正确重试 ViewModel 调用。
在
@Override
public void onRetryClick() {
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}
您不应该重新观察实时数据,您应该使用 viewModel.fetchUserInfo();
重新发出请求。
你不需要重新观察它,因为它已经被观察到,你不需要在onCreateView
中调用viewModel.fetchUserInfo();
,因为它会自动获取你第一次打电话给 getUserInfoMutableLiveData
由于答案和评论对我有帮助,解决方案是将我正在做的两件事结合起来。
UserViewModel 应该保持不变,除了 fetchUserInfo()
必须是 public。
UserViewModel.java
public class UserViewModel extends ViewModel {
private MutableLiveData<UserResponse> userInfoMutableLiveData;
public MutableLiveData<UserResponse> getUserInfoMutableLiveData() {
if (userInfoMutableLiveData == null) {
userInfoMutableLiveData = new MutableLiveData<>();
fetchUserInfo();
}
return userInfoMutableLiveData;
}
public void fetchUserInfo() {
// Asynchronous call using RxJava to fetch user information.
}
您应该观察 onCreate()
中的 LiveData,然后在重新尝试加载或更新内容时调用它。
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
return view;
}
@Override
public void onRetryClick() {
viewModel.fetchUserInfo();
}