RxAnroid之UI控件(View、Widget)RxBinding(同时异步执行多个Observable、同时异步执行多个任务)

来源:互联网 发布:什么是返利网和淘宝客 编辑:程序博客网 时间:2024/06/05 10:21

RxBinding是Android种UI控件的Api

将RxJava应用于Android的好处就是更方便地组合各种异步操作,将Android中复杂的UI交互简单化,尤其是当触发多重UI事件时。还可以使用RxJava中过滤、结合、异步、条件等方法,是逻辑简洁、代码易读化。

RX对View的操作需要导入compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'


一、异步完成多种事情,全部结束后执行某项操作

经常有这样的需求,需要多种事情完成之后执行某个操作。比如下面的例子中需要下载图片、下载app、下载资源文件,下载所需要的时间都是不确定的,但是需要在所有事情完成之后执行下一步操作,这个例子中只是将下载完成简单地显示到了TextView中

  //下载图片        Observable<Boolean> downLoadPics = Async.start(new Func0<Boolean>() {            @Override            public Boolean call() {                try {                    Thread.sleep(10*1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                Log.e(TAG,"图片下载成功,耗时10s。。。。。。。。。。。。。。");                return true;            }        });        //下载app        Observable<Boolean> downLoadApps = Async.start(new Func0<Boolean>() {            @Override            public Boolean call() {                try {                    Thread.sleep(5*1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                Log.e(TAG,"app下载成功,耗时5s。。。。。。。。。。。。。。");                return true;            }        });        //下载资源文件        Observable<Boolean> downLoadRes = Async.start(new Func0<Boolean>() {            @Override            public Boolean call() {                try {                    Thread.sleep(4*1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                Log.e(TAG,"app下载成功,耗时4s。。。。。。。。。。。。。。");                return true;            }        });        Observable observable = RxView.clicks(btDownload);        observable.combineLatest(downLoadPics, downLoadApps, downLoadRes, new Func3<Boolean, Boolean, Boolean, Object>() {            @Override            public Object call(Boolean aBoolean, Boolean aBoolean2, Boolean aBoolean3) {                Log.e(TAG,"图片、app、资源均下载成功。。。。。。。。。。。。。。");                return aBoolean&&aBoolean2&&aBoolean3;            }        })        .observeOn(AndroidSchedulers.mainThread())        .subscribe(new Action1<Object>() {            @Override            public void call(Object o) {
<span style="white-space:pre"></span>//10s后才显示                tvRx.setText("所有资源都下载成功了。。。。。。。。。。。。。");            }        });

运行结果:


界面显示为:


二、防止按钮被重复点击



int count = -1;    private void testRepeatClick() {        RxView.clicks(btDownload)                .throttleFirst(1, TimeUnit.SECONDS)                .subscribe(new Action1<Void>() {                    @Override                    public void call(Void aVoid) {                        ++count;                        tvRx.setText(count+"");                    }                });    }

在1s内多次点击,只计数一次

运行结果:


注:1.参考资料:https://github.com/ReactiveX/RxAndroid/wiki#removed

       https://github.com/JakeWharton/RxBinding

       https://guides.codepath.com/android/RxJava-and-RxBinding

       http://blog.csdn.net/theone10211024/article/details/50435325

         2.各libray包的bindings

    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'                                                           //andrioid中view的bindings

            compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'                                      //v4包的bingdings

            compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0'                                //appcompat-v7包的bindings

            compile 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'                                             //design包的bindings

    compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:0.4.0'    //recyclerview-v7包的bindings

    compile 'com.jakewharton.rxbinding:rxbinding-leanback-v17:0.4.0'    //leanback-v17包的bindings

        

0 0
原创粉丝点击