更新ViewModel数据?

时间:2018-10-17 20:17:44

标签: android mvvm viewmodel

我有一个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); } 并且没有加载新的{

我尝试的内容

我试图像这样在用户界面中获取用户信息。

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调用。

2 个答案:

答案 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();
}