我刚开始尝试在这里学习RxJava / RxAndroid,我正在尝试验证表单。我使用了Kaushik Gopal的lovely example here并使我的编辑文本很好地与combineLatest
订阅一起使用。现在我想在同一个订阅中观察其他内容。我有一个按钮来选择一个出生日期,它会在我的Fragment的onActivityResult()函数中返回它的结果。我需要什么样的观察者?
private Observable<CharSequence> mNameChangeObservable; //etc.
private Observable<Date> mDateChangeObservable;
OnCreateView():
mIDNumberChangeObservable = RxTextView.textChanges(mIDNumberEditText).skip(1);
mNameChangeObservable = RxTextView.textChanges(mNameEditText).skip(1);
mEmailChangeObservable = RxTextView.textChanges(mEmailEditText).skip(1);
mPasswordChangeObservable = RxTextView.textChanges(mPasswordEditText).skip(1);
//mDateChangeObservable = ???;
订阅:
private void combineLatestEvents() {
mSubscription = Observable.combineLatest(mLLNumberChangeObservable,
mNameChangeObservable,
mEmailChangeObservable,
mPasswordChangeObservable,
mDateChangeObservable,
new Func5<CharSequence, CharSequence, CharSequence, CharSequence, Date, Boolean>() {
@Override
public Boolean call(CharSequence newIDNumber,
CharSequence newName,
CharSequence newEmail,
CharSequence newPassword,
Date newDate) {
boolean idNumberValid = !isEmpty(newIDNumber) && newIDNumber.length() == 8;
if (!idNumberValid) {
mLLNumberEditText.setError("Invalid ID Number!");
}
boolean nameValid = !isEmpty(newName);
if (!nameValid) {
mNameEditText.setError("Invalid Name!");
}
boolean emailValid = !isEmpty(newEmail) &&
EMAIL_ADDRESS.matcher(newEmail).matches();
if (!emailValid) {
mEmailEditText.setError("Invalid Email!");
}
boolean passValid = !isEmpty(newPassword) && newPassword.length() >= 8;
if (!passValid) {
mPasswordEditText.setError("Invalid Password!");
}
//Validate Date
return idNumberValid && nameValid && emailValid && passValid;
}
})//
.subscribe(new Observer<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Boolean formValid) {
if (formValid) {
mSubmitButton.setEnabled(true);
} else {
//Also print error here
mSubmitButton.setEnabled(false);
}
}
});
}
OnActivityResult:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) return;
if (requestCode == REQUEST_DATE) {
mDate = (Date) data.getSerializableExtra(Constants.Extras.EXTRA_DATE);
updateDobButtonText(mDate);
//Somehow tell my subscription I have a new date
}
}
答案 0 :(得分:1)
您可以按照当前模式从按钮获取事件。 Button
是TextView
的子类,因此您可以使用RxTextView.textChanges()
作为参数调用Button
。当按钮文本更改时,它将发出项目。具体来说,如果这一行
updateDobButtonText(mDate);
致电Button.setText()
,您应该在订阅者处获得该活动。
答案 1 :(得分:0)
好吧,经过一段时间的谷歌搜索后,我得出的结论是,挂钩生命周期事件的正常方法是使用Trello's RxLifeCycle library。但是因为我只是想发一个简单的同步事件而且我确切知道何时(在onActivityResult期间),这是我找到的解决方案:
(1)创建一个主题 - 在这种情况下,我认为PublishSubject是最好的,因为它只是一个需要发出的对象。
private PublishSubject<Date> mDateSubject = PublishSubject.create();
(2)将其转换为Observable,它将监听主线程上的事件。
public Observable<Date> makeDateObservable() {
return mDateSubject.observeOn(AndroidSchedulers.mainThread());
}
(3)当我们拥有它时,通过调用对象的next()来发射对象:
mDateSubject.onNext(mDate);