更新 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();
}