大家都知道Rxjava神通廣大,無所不能,并有效避免Call Hell(回調(diào)地獄)模式,使大量的監(jiān)聽事件clickListener變換成流式編程,提高代碼閱讀性,提升代碼維護成本。今天我通過例子詳解Rxjava中的RxTextview詳解,讓你一舉搞懂Rxjava用法,語法以及操作實例(明白 簡單掌握)。
實際用戶場景舉例

根據(jù)用戶輸入的價格(價格范圍0.-1)、輸入的數(shù)量(10-無限)計算出總預(yù)計收入,如果寫錯了(舉例價格范圍錯誤、數(shù)量不對)賣出按鈕無效(disable).
如果用傳統(tǒng)的edittext.setOnChangeListner要加兩個,動態(tài)計算較為難以理解。用Rxjava 則合并兩個動態(tài)計算的Observable,最后動態(tài)算出結(jié)果,代碼如下。
Observable<CharSequence> priceObservable = RxTextView.textChanges(priceEdit.getEditText());
Observable<CharSequence> countObservable = RxTextView.textChanges(countEdit.getEditText());
sellBtnSubscription = Observable.combineLatest(priceObservable, countObservable,
(priceSequence, countSequence) -> {
if (priceSequence.toString().startsWith(".")) {
priceSequence = "0" + priceSequence;
priceEdit.setText("0.");
priceEdit.getEditText().setSelection(priceEdit.getText().length());
}
double inputPrice = StringUtils.isEmpty(priceSequence.toString()) ? 0 : Double.parseDouble(priceSequence.toString());
int inputCount = StringUtils.isEmpty(countSequence.toString()) ? 0 : Integer.parseInt(countSequence.toString());
return inputPrice > 0 && inputCount > 0;
}).subscribe(new Observer<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Boolean isSellBtnEnable) {
sellBtn.setEnabled(isSellBtnEnable);
String handFeetStr = "(含手續(xù)費)";
if (isSellBtnEnable) {
double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());
predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //賣出聯(lián)豆的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
//( 含手續(xù)費 )
if (predictedIncome == 0) {
predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //賣出聯(lián)豆的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
} else {
predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr); //賣出聯(lián)豆的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
}
} else {
predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元"); //賣出聯(lián)豆的預(yù)計收入
}
}
});
}
簡單詳解:
獲得兩個EditText的 可被觀察對象
獲得兩個edittext的可被觀察的(observable<CharSequence>對象
Observable<CharSequence> priceObservable =
RxTextView.textChanges(priceEdit.getEditText());
Observable<CharSequence> countObservable =
RxTextView.textChanges(countEdit.getEditText());
綜合運算
動態(tài)算出 價格、數(shù)量是否合理
sellBtnSubscription = Observable.combineLatest(priceObservable, countObservable,
(priceSequence, countSequence) -> {
if (priceSequence.toString().startsWith(".")) {
priceSequence = "0" + priceSequence;
priceEdit.setText("0.");
priceEdit.getEditText().setSelection(priceEdit.getText().length());
}
double inputPrice = StringUtils.isEmpty(priceSequence.toString()) ? 0 : Double.parseDouble(priceSequence.toString());
int inputCount = StringUtils.isEmpty(countSequence.toString()) ? 0 : Integer.parseInt(countSequence.toString());
return inputPrice > 0 && inputCount > 0;
}).subscribe(new Observer<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Boolean isSellBtnEnable) {
sellBtn.setEnabled(isSellBtnEnable);
String handFeetStr = "(含手續(xù)費)";
if (isSellBtnEnable) {
double predictedIncome = Double.parseDouble(priceEdit.getText().toString()) * Integer.parseInt(countEdit.getText());
predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //賣出XX幣的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
//( 含手續(xù)費 )
if (predictedIncome == 0) {
predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元"); //賣出XX幣的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
} else {
predictedIncomeTv.setText(FormatUtil.formatMoney(predictedIncome) + "元" + handFeetStr); //賣出XX幣的預(yù)計收入(沒有去除手續(xù)費的預(yù)估收入)
}
} else {
predictedIncomeTv.setText(FormatUtil.formatMoney(0) + "元"); //賣出聯(lián)豆的預(yù)計收入
}
}
});