初涉Rx套餐 之RxBinding(讓你的事件流程更清晰)
最近下班回家都在WOW,週末就爆肝,感覺人都要GO DIE了,昨天下午看了看RxBinding相關的功能感覺還是蠻強大的,所提供的API也是相當豐富(基本Rx套餐都是互通的),然後就把之前的Rx例子翻出來重新寫一下。
什麼是RxBinDing?有什麼作用?(網上相關的介紹也有,我這裡整合一下)
JakeWharton 提供了一套在 Android 平臺上的基於 RxJava的 Binding API。
類似設定 OnClickListener 、設定 TextWatcher 這樣的註冊繫結物件的 API。
並對普通的控制元件,V4,V7等等做了相應的支援。
如何使用依賴RxBinding這裡不說了,這裡來說下匿名函式的問題
因為谷歌和甲骨文之間搞不清楚所以安卓支援java8的特性需要“特殊操作”,那為什麼要用java8特性呢?別的不說,主要是 Lambda,雖說這玩意可讀性差,寫起來自己繞暈,但是 省程式碼,省程式碼,省程式碼!!
理由:不流氓+搭建簡單
需要什麼?
然後在你的gradle裡配置如下(截圖是怕有寫小夥伴貼錯地方):
這樣就可以用java 8的新特性了。
因為只演示普通控制元件,所以就用(按鈕啊,文字啊,選擇框啊什麼的都在裡面)
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
那就簡單的搞個輸入框,搞個按鈕然後輸入內容在TextView裡顯示就行。
廢話不多說,直接上程式碼
public class MainActivity extends AppCompatActivity {
Toolbar toolBar;
EditText edit;
TextView result;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
logic();
}
private void init() {
setSupportActionBar(toolBar);
toolBar = (Toolbar) findViewById(R.id.toolBar);
result = (TextView) findViewById(R.id.result);
edit = (EditText) findViewById(R.id.edit);
btn = (Button) findViewById(R.id.btn);
}
private void logic() {
toolBar.setTitle("RxAndroidDemo");
saveText();
reFreshText();
}
private void reFreshText() {
RxTextView.afterTextChangeEvents(edit).subscribe(textViewAfterTextChangeEvent -> {
result.setText(textViewAfterTextChangeEvent.editable().toString());
});
}
private void saveText() {
RxView.clicks(btn)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Void>() {
@Override
public void onCompleted() {
result.setText(SharePreferencesTools.getString(MainActivity.this, "user") + " now ");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Void aVoid) {
SharePreferencesTools.putString(MainActivity.this, "user", edit.getText().toString().trim());
onCompleted();
}
});
}
}
這邊的Demo並沒有用註解獲取物件,實際上組合拳套餐會用的更舒服點,畢竟有外掛一鍵find。
我們這些”RxView”的行為還是要在onCreate裡執行了(儘管使用者不點不觸發,但是你還得像平時setListener那樣先把行為註冊掉)
EditText用RxTextView,其他一些還是用RxView.
api提供了 諸如textChanges ,afterTextChangeEvents等一系列替代之前回調的方法,進一步擺脫“回撥地獄”。
因為是Rx套餐,所以那些執行緒行為,非同步行為,.map() .first()等等等方法都可以用
這邊提再一個“優化”的問題
- 當你邏輯結束了不用了,之前訂閱的被觀察者與觀察者的關係請做取消訂閱操作,呼叫 unsubscribe()就行