最近微博不時看到有提到rx-java,聯(lián)系到之前看到的reactjs,也就抽時間學(xué)習(xí)了一下,并一直在思考此種模式的優(yōu)劣。目前得出的結(jié)論是:
** 優(yōu)點**
- 天然支持并發(fā)
- 代碼更易讀
缺點
- 抽象程度太過了(糾結(jié)中,覺得也算優(yōu)點)
- java語言上及android對其的支持上還不夠(對比.NET)
今天就拿從ReactiveCocoa處看到的一個使用場景來練手,先上代碼:
public class LoginActivity extends Activity {
@InjectView(R.id.username)
EditText usernameEditText;
@InjectView(R.id.password)
EditText passwordEditText;
@InjectView(R.id.signin)
Button signinButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.inject(this);
Observable<Boolean> observableUsername = WidgetObservable.text(usernameEditText).map(new Func1<OnTextChangeEvent, Boolean>() {
@Override
public Boolean call(OnTextChangeEvent onTextChangeEvent) {
Boolean validateState = onTextChangeEvent.view().getText().length() > 6;
if(!validateState) {
onTextChangeEvent.view().setError("length must great 6");
}
return validateState;
}
});
Observable<Boolean> observablePassword = WidgetObservable.text(passwordEditText).map(new Func1<OnTextChangeEvent, Boolean>() {
@Override
public Boolean call(OnTextChangeEvent onTextChangeEvent) {
Boolean validateState = onTextChangeEvent.view().getText().length() > 3;
if(!validateState) {
onTextChangeEvent.view().setError("length must great 3");
}
return validateState;
}
});
Observable.combineLatest(observableUsername, observablePassword, new Func2<Boolean, Boolean, Boolean>(){
@Override
public Boolean call(Boolean validateStateUsername, Boolean validateStatePassword) {
return validateStateUsername && validateStatePassword;
}
}).startWith(false).subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean state) {
signinButton.setEnabled(state);
}
});
}
}
要在有l(wèi)ambda表達式的情況下,代碼可更精簡易讀。