我試圖在單擊按鈕時使用RxJava對EditText執行驗證,但是我很難將驗證移動到ViewModel,這會使測試變得更容易。我使用Jake Wharton的RxBindings來獲取UI輸入,並使用PublishSubject的RxJava2的Flowable.combineLatest在單擊AlertDialog上的按鈕時觸發Flowable。這是我走到這一步:使用RxJava2在ViewModel上進行EditText驗證
private Flowable<CharSequence> projectTitleObservable;
private final PublishSubject<CharSequence> createProjectClicked = PublishSubject.create();
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Context context = getActivity();
View dialogView = LayoutInflater.from(context).inflate(R.layout.new_project, null);
ButterKnife.bind(this, dialogView);
projectTitleObservable = RxTextView.textChanges(projectNameEditText).toFlowable(BackpressureStrategy.LATEST);
ConnectableFlowable <CharSequence> connectableFlowable = Flowable.combineLatest(createProjectClicked.toFlowable(BackpressureStrategy.LATEST), projectTitleObservable, (ignored, title) -> {
boolean validTitle = !TextUtils.isEmpty(title);
if (!validTitle) {
projectNameEditText.setError("Project must have a name");
}
Timber.d("Hey, lambdas work! Look -> " + title);
return title;
})
.publish();
connectableFlowable.subscribe(test -> Timber.d(test.toString()));
return new AlertDialog.Builder(context)
.setTitle("Add new Project")
.setView(dialogView)
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
Timber.d("Ok clicked!");
createProjectClicked.onNext("It works!");
})
.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> Timber.d("Cancel clicked!"))
.create();
}
我只發佈和訂閱在同一個地方,以確保它移動到ConnectableFlowable在ViewModel前實際工作。我得到的唯一日誌是「確定點擊!」這對我來說意味着它從來沒有訂閱。任何想法爲什麼它不訂閱?
如果返回標題前加上一個Log.d它會被執行嗎? –
我想你應該在你的combineLastst closure裏面調用onNext –
在返回標題之前有一個Timber.d(和Log.d相同),它永遠不會被調用。這個想法是,我希望能夠在我調用createProjectClicked.onNext時執行ConnectableFlowable,如果日誌未被調用,那麼onNext將不會在combineLatest中調用。 – DavisJP