RxJava

介绍:
RxJava 在 GitHub 主页上的自我介绍是 :
“a library for composing asynchronous and event-based programs using observable sequences for the Java VM”
(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。
其实就是-------------------异步。

重要的组成:
1.核心设计模式:观察者模式,(订阅发布设计模式)
2.操作符
3.线程调度器

优点:
异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
还是一个词--------------简洁(逻辑简洁)

开始代码
导入依赖,但是依赖属实有点乱

/*RxAndroid所依赖的库*/
    implementation 'io.reactivex:rxandroid:1.2.1'
    implementation 'io.reactivex:rxjava:1.1.6'

一些操作介绍

1.基本使用

//RxAndroid基本使用
private void rxAndroidBase() {
        //创建被观察者
        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                //开始发送的事件
                e.onNext("家辉1");
                e.onNext("家辉2");
                //需要注意的是:开始发送的事件不能放到下面这两个方法的下面,还有这两个不能同时出现
                //观察结束的时候回调
                e.onComplete();
                //异常的时候回调,没有执行
                e.onNext("家辉3");
            }
        });

        //创建观察者Subscriber是observer扩展的类,但是都差不多
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String value) {
                Log.e("wjh", "onNext: "+value );
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };


    }

接收一个集合,对其一个一个观察

//创建一个集合
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
        //一个一个输出
        Observable.from(integers)
                //如果不用错误和结束的那个方法直接new下方这个
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println("onNext : " + integer);
                    }
                });

RxAndroid接收一个集合对象,对整个集合进行操作

//创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        Observable.just(integers)
                .subscribe(new Action1<List<Integer>>() {
                    @Override
                    public void call(List<Integer> integers) {
                        System.out.println(integers);
                    }
                });

RxAndroid接收一个集合对象,对其中数据进行过滤

//创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        Observable.from(integers)
        //对集合数据进行过滤,只发送符合条件的事件
                .filter(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        //只要符合的条件就行,可以是偶数什么的
                        return integer < 4;
                    }
                })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println("onNext : " + integer);
                    }
                });

//RxAndroid接收一个集合对象,对其中数据进行转换

//创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        Observable.from(integers)
                //提示:可以把流转换成bitmap,文件,String...
                .map(new Func1<Integer, String>() {
                    @Override
                    public String call(Integer integer) {
                        return integer.toString();
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        System.out.println(s);
                    }
                });

把拿到的集合,进行拆分观察

//创建一个集合,并装上数据
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> integers1 = Arrays.asList(6, 7, 8);
        List<Integer> integers2 = Arrays.asList(9, 10);
        Observable.just(integers,integers1,integers2)
                .flatMap(new Func1<List<Integer>, Observable<?>>() {
                    @Override
                    public Observable<?> call(List<Integer> integers) {
                        return Observable.from(integers);
                    }
                })
                .subscribe(new Action1<Object>() {

                    @Override
                    public void call(Object o) {
                        System.out.println(o);
                    }
                });

******************************下面的东西重要了,实现异步
使用RxAndroid做线程间的通讯,线程调度器

//注意:这里用到了SD卡,记得加一下权限
        Observable.just(Environment.getExternalStorageDirectory().getAbsolutePath() + "/1.jpg")
        //加载的是字符串,转换为Bitmp对象
                   .map(new Func1<String, Bitmap>() {
                       @Override
                       public Bitmap call(String s) {
                           String name = Thread.currentThread().getName();
                           System.out.println("Func1的call所在线程名称 : " + name);
                           Bitmap bitmap = BitmapFactory.decodeFile(s);
                           return bitmap;
                       }
                   })
                //IO:线程名称RxIoScheduler-2(子线程,内部用到了一个线程池)
                .subscribeOn(Schedulers.io())//可以执行多次,对不同数据,在不同的线程中调用
                //该方法决定了 Action1的call方法(观察者执行逻辑)运行在哪个线程  mainThread:主线程
                .observeOn(AndroidSchedulers.mainThread())//只能执行一次,多次调用,以第一次为基准
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        //打印线程所在名称
                        String Threadname = Thread.currentThread().getName();
                        System.out.println("Action1的call所在线程名称 : " + Threadname);
                        ImageView.setImageBitmap(bitmap);
                    }
                });

*************************************扩展点小知识,关于用户狂点button按钮问题
1.创建类

//被监听
    class MyOnSubscribe implements Observable.OnSubscribe<View>{

        public MyOnSubscribe(View view) {
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    System.out.println("我被狂点中...");
                    mSubscriber.onNext(v);
                }
            });

        }

        private Subscriber mSubscriber;
        @Override
        public void call(Subscriber<? super View> subscriber) {
            mSubscriber = subscriber ;
        }
    }
 //创建被被观察者
        Observable.create(new MyOnSubscribe(button))
                //设置时间
                .throttleFirst(10,TimeUnit.SECONDS)
                
                .subscribe(new Action1<View>() {
                    @Override
                    public void call(View view) {
                        System.out.println("我在call方法中,我被点击了,有反应了");
                    }
                });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值