1. 程式人生 > >初涉Rx套餐 之RxBinding(讓你的事件流程更清晰)

初涉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()就行