我有一个UserViewModel,负责获取用户信息,然后将其显示在UI中。
UserViewModel.java
List
我通过以下方式在用户界面中调用它。
ProfileFragment.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.
}
这将正确显示数据,并且可以正常工作。
问题
当没有互联网连接时,我的应用程序会显示一个屏幕,其中没有互联网连接警告,然后显示一个按钮以重试该呼叫。
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;
}
假定以下情况,我在没有互联网连接的情况下拨打电话->显示重试按钮->我重新连接到互联网,然后->按重试按钮。
由于它只是检索先前的@Override
public void onRetryClick() {
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}
并且没有加载新的{1>。
我尝试的内容
我试图像这样在用户界面中获取用户信息。
ProfileFragment.java
userInfoMutableLiveData
然后像这样呼叫@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;
}
。
ProfileFragment.java
onRetryClick()
它解决了这个问题,因为每次我单击重试按钮时都会打一个电话,但是,它失去了ViewModel的目的,即只加载一次数据然后检索它。
我需要什么?
最后,如果没有互联网连接,我需要正确地重试ViewModel调用。
答案 0 :(得分:1)
在
@Override
public void onRetryClick() {
viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}
您不应重新观察实时数据,而应使用viewModel.fetchUserInfo();
重新发出请求。
您不需要重新观察它,因为它已经被观察到,并且您不需要在viewModel.fetchUserInfo();
中调用onCreateView
,因为它会在第一次自动获取您致电getUserInfoMutableLiveData
答案 1 :(得分:0)
当答案和评论对我有所帮助时,解决方案是将我正在做的两件事结合起来。
UserViewModel应该保持相同,除了fetchUserInfo()
必须是公共的。
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();
}