RxAndroid 使用

本文介绍了RxAndroid的GitHub地址及环境搭建,通过简单的代码示例展示了create(), just(), from()等事件产生方法,以及map(), flatMap(), scan(), filter()等事件加工方法。文章还提到了subscribe()事件消费,并讨论了线程控制。最后,文中列举了RxAndroid在并发数据获取、按钮防重复点击和响应式界面等场景的应用。" 136842141,12383355,华为OD机试:C卷D卷整数最小和求解,"['华为od', 'C语言', '开发语言']
摘要由CSDN通过智能技术生成

 

RxAndroid GitHub地址:          https://github.com/ReactiveX/RxAndroid

环境搭建

RxAndroid环境只需求要引入如下项目即可,我们不但需要RxAndroid项目还需要RxJava项目。

implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.x.x'

简单的demo:

        //创建一个被观察者(发布者)
        Observable observable = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1001);
                subscriber.onNext(1002);
                subscriber.onNext(1003);
                subscriber.onCompleted();
            }
        });
 
        //创建一个观察者
        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "onCompleted.. ");
            }
 
            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "subscriber onError.. " + e.getMessage());
            }
 
            @Override
            public void onNext(Integer integer) {
                Log.d(TAG, "onNext.. integer:" + integer);
            }
        };
 
        //注册观察者(这个方法名看起来有点怪,还不如写成regisiterSubscriber(..)或者干脆addSubscriber(..))
        //注册后就会开始调用call()中的观察者执行的方法 onNext() onCompleted()等
        observable.subscribe(subscriber);

 

对于线程还需要注意

  • create() , just() , from() 等 --- 事件产生
  • map() , flapMap() , scan() , filter() 等 -- 事件加工
  • subscribe() -- 事件消费

事件产生:默认运行在当前线程,可以由 subscribeOn() 自定义线程
事件加工:默认跟事件产生的线程保持一致, 可由 observeOn() 自定义线程
事件消费:默认运行在当前线程,可以有observeOn() 自定义


 

from:在Rxndroid的from操作符到2.0已经被拆分成了3个,fromArray, fromIterable, fromFuture接收一个集合作为输入,然后每次输出一个元素给subscriber。

Observable.fromArray(new Integer[]{1, 2, 3, 4, 5}).subscribe(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) throws Exception {
        Log.i(TAG, "number:" + integer);
    }
});

结果:number:1
number:2
number:3
number:4
number:5

filter:条件过滤,去除不符合某些条件的事件。举个栗子:

Observable.fromArray(new Integer[]{1, 2, 3, 4, 5})
       .filter(new Predicate<Integer>() {
           @Override
           public boolean test(Integer integer) throws Exception {
               // 偶数返回true,则表示剔除奇数,留下偶数
               return integer % 2 == 0;

           }
       }).subscribe(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) throws Exception {
        Log.i(TAG, "number:" + integer);
    }
});

结果:number:2
number:4

take:最多保留的事件数。

Observable.just("1", "2", "6", "3", "4", "5").take(2).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String value) {
                Log.d(TAG,value);
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

结果:1
2

doOnNext:如果你想在处理下一个事件之前做某些事,就可以调用该方法

Observable.fromArray(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}).filter(new Predicate<Integer>() {
    @Override
    public boolean test(Integer integer) throws Exception {
        // 偶数返回true,则表示剔除奇数
        return integer % 2 == 0;
    }
})// 最多保留三个,也就是最后剩三个偶数
        .take(3).doOnNext(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) throws Exception {
        // 在输出偶数之前输出它的hashCode
        Log.i(TAG, "hahcode = " + integer.hashCode() + "");
    }
}).subscribe(new Observer<Integer>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(Integer value) {
        Log.i(TAG, "number = " + value);
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }
});

 

结果:hahcode = 2
number = 2
hahcode = 4
number = 4
hahcode = 6
number = 6

使用场景:

  1. 界面需要等到多个接口并发取完数据,再更新
  2. Observable<String> observable1 = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("haha");
            }
        }).subscribeOn(Schedulers.newThread());
    
        Observable<String> observable2 = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("hehe");
            }
        }).subscribeOn(Schedulers.newThread());
    
    
        Observable.merge(observable1, observable2)
                .subscribeOn(Schedulers.newThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
    
                    }
    
                    @Override
                    public void onNext(String value) {
                        Log.d(TAG,value);
                    }
    
                    @Override
                    public void onError(Throwable e) {
    
                    }
    
                    @Override
                    public void onComplete() {
    
                    }
                });
    

     

 

 

  1. 界面按钮需要防止连续点击的情况

 

RxView.clicks(button)
        .throttleFirst(1, TimeUnit.SECONDS)
        .subscribe(new Observer<Object>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Object o) {
                Log.i(TAG, "do clicked!");
            }
        });

  1. 响应式的界面 比如勾选了某个checkbox,自动更新对应的preference
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);

Preference<String> username = rxPreferences.getString("username");
Preference<Boolean> showWhatsNew = rxPreferences.getBoolean("show-whats-new", true);

username.asObservable().subscribe(new Action1<String>() {
  @Override public void call(String username) {
    Log.d(TAG, "Username: " + username);  读取到当前值
  }
}

RxCompoundButton.checks(showWhatsNewView)
    .subscribe(showWhatsNew.asAction());

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值