Обновление данных ViewModel? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть UserViewModel, который отвечает за выборку информации о пользователе, а затем я отображаю ее в пользовательском интерфейсе.

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.
}

Я звонюэто в пользовательском интерфейсе следующим образом.

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 и не загружает новое.

ЧТО Я ПОПРОБОВАЛ

Я пытался получить информацию о пользователе в пользовательском интерфейсе, как это.

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 в случае отсутствия подключения к Интернету.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Поскольку ответы и комментарии помогли мне, решением было объединить обе вещи, которые я делал.

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.
}

Вы должны соблюдатьLiveData в onCreate(), а затем вызвать его при повторной попытке загрузить содержимое или обновить его.

@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();
}
0 голосов
/ 17 октября 2018

В

@Override
public void onRetryClick() {
    viewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
}

Вы не должны повторно наблюдать живые данные, вы должны повторно выполнить запрос, используя viewModel.fetchUserInfo();.

Вам не нужно повторно наблюдать его, потому что он уже наблюдается, и вам не нужно вызывать viewModel.fetchUserInfo(); в onCreateView, потому что он будет загружен автоматически в первый раз, когда вызвонок getUserInfoMutableLiveData

...