Триггер Просмотр действий из ViewModel без данных - PullRequest
0 голосов
/ 27 февраля 2019

В настоящее время я наблюдаю некоторые данные в моем ViewModel.Как только эти данные меняются, мой ViewModel получает информацию и выполняет некоторые вычисления.После этого это вызовет какое-то действие на мой взглядЭто, очевидно, невозможно напрямую из-за слабой связи.Итак, я создал LiveData, который выдает значение после вычислений, которое может наблюдаться представлением, чтобы инициировать действие appopriate (то есть запустить фрагмент).Моя проблема здесь в том, что у меня есть некоторые данные для LiveData, но мне не нужны никакие данные для запуска этого действия.

Пример:

public class LandingViewModel extends ViewModel {
    private static final String TAG = "LandingViewModel";

    private final SessionKeyDao sessionKeyDao;
    private final CompositeDisposable compositeDisposable = new CompositeDisposable();
    private final MutableLiveData<Void> showGameFragment = new MutableLiveData<>();

    @Inject
    public LandingViewModel(final ProtocolMessageRepository protocolMessageRepository, final SessionKeyDao sessionKeyDao) {
        this.sessionKeyDao = sessionKeyDao;

        compositeDisposable.add(protocolMessageRepository.getStartGameReponse()
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .subscribe(this::OnStartGame, LandingViewModel::onError)
        );
    }

    private static void onError(final Throwable throwable) {
        Log.d(TAG, throwable.getMessage());
    }

    @Override
    protected void onCleared() {
        compositeDisposable.clear();
    }

    public LiveData<Void> getShowGameFragment() {
        return showGameFragment;
    }

    private void OnStartGame(final StartGameResponse startGameResponse) {
        sessionKeyDao.save(new SessionKey(startGameResponse.getSessionId()));
        showGameFragment.postValue(null);
    }
}

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 28 февраля 2019

вы можете использовать отложенное намерение, получить ожидающее намерение для конструктора модели представления через фабрику, а затем использовать отложенное намерение с вызовом отправки его

class LandingViewModelFactory extends ViewModelProvider.NewInstanceFactory {

  PendingIntent pi;

   public LandingViewModelFactory(PendingIntent pi){
     super();
     this.pi = pi;
   }

   @NonNull
   @Override
   public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
      return (T) new LandingViewModel(pi);;
   }
}

PendingIntent pi = PendingIntent.getActivity(context, recCode, intent, flag);
// get pi to view model constructor through factory

viewModel = ViewModelProviders.of(this, new LandingViewModelFactory(pi)).get(LandingViewModel.class)   

//--------------------------------view model
public class LandingViewModel extends ViewModel {
    PendingIntent pi;

   public LandingViewModel(PendingIntent pi){
        this.pi = pi;
   }
   // then call send in view model when you need to start activity
   private void OnStartGame(final StartGameResponse startGameResponse) {
       sessionKeyDao.save(new SessionKey(startGameResponse.getSessionId()));
       pi.send();
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...