RxAndroid初体验

还是先来一个简单的demo,里面的泛型string即是返回的数据类型

  final List<String> allData = new ArrayList();
        allData.add("123");
        allData.add("456");
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                for (String s : allData) {
                    e.onNext(s);
                }

            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                if (s.equals("123")) {
                    Log.e("收到123", "======");
                } else {
                    Log.e("收到456", "======");
                }
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

第二个demo

private void showImage(String imageUrl) {
        Observable.create(new ObservableOnSubscribe<Bitmap>() {
            @Override
            public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<Bitmap> e) throws Exception {
                e.onNext(BitmapFactory.decodeResource(getResources(), R.drawable.shoucang));
            }
        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Bitmap>() {
            @Override
            public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {

            }

            @Override
            public void onNext(@io.reactivex.annotations.NonNull Bitmap s) {
                jcVideoPlayerStandard.thumbImageView.setImageBitmap(s);
            }

            @Override
            public void onError(@io.reactivex.annotations.NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }



概述:被观察者-Observable;观察者-Observer/Subcriber;建立订阅关系-Observable.subscribe(Observer/Subcriber) 注:在rx2.0版本Subscriber将不能使用该方法建立订阅关系;线程-Scheduler. RxJava遵循线程不变的规则,在哪个线程产生的事件就在哪个线程消费该事件。

1.简单使用例子,在activity中根据传入的string来显示button的内容

创建被观察者(数据的传入变化):有多种创建方法,列举如下三种

 //创建被观察者,使用基本方法oncreat()
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(@NonNull ObservableEmitter e) throws Exception {
                e.onNext("stop");
                e.onNext("start");

                e.onComplete();
            }
        });
第二种:
 //创建被观察者-使用just方法,直接把需要传入的参数写入
        Observable observable1 = Observable.just("start", "stop");
        //创建被观察者-使用from方法
        String[] strings = {"start", "stop"};
        Observable observable2 = Observable.fromArray(strings);

2.观察者的创建,以及与被观察者之间建立订阅关系

 //创建观察者(因数据传入的不同而进行不同的操作):
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                //这里的disposable可以用来解除订阅
            }

            @Override
            public void onNext(@NonNull String o) {
                Log.e("收到数据", o);
                if (o.equals("stop")) {
                    Log.e("进入到判断证", "===");
                    textView.setText("收到消息");
                }
                if (o.equals("start")) {
                    textView1.setText("收到start");
                }
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.e("onError", "发生错误");
            }

            @Override
            public void onComplete() {
                Log.e("onComplete", "事件调用完成");
            }
        };
        //建立订阅关系
        observable2.subscribe(observer);
3.刚才的demo是一个均在主线程进行操作的例子,但是rxjava主要的特点是异步,在代码中的体现就是可以选择观察者和被观察者处理所在的线程;已知线程如下:

 线程类:Scheduler
        Schedulers.immediate():直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
        Schedulers.newThread():总是启用新线程,并在新线程执行操作。
        Schedulers.io():I / O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread () 差不多,区别在于 io ()
        的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io () 比 newThread () 更有效率。不要把计算工作放在 io () 中,
        可以避免创建不必要的线程。
        Schedulers.computation():计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。
        这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
        Android 专用 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
        有了这几个 Scheduler ,就可以使用 subscribeOn () 和 observeOn () 两个方法来对线程进行控制了。 
        subscribeOn():
        指定 subscribe () 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程,或者叫做事件产生的线程。 
        observeOn():
        指定 Subscriber 所运行在的线程,事件消费的线程。

4.关于事件处理以及事件消费所在线程的切换demo

一个读取图片的例子,一种在主线程读取,一种在子线程读取:
子线程:

  public class MyAxTest extends Activity {
            List<String> allImage;
            /*
            * 被观察者
            * */
            Observable observable = Observable.create(new ObservableOnSubscribe() {
                @Override
                public void subscribe(@NonNull ObservableEmitter e) throws Exception {

                    //  List<Bitmap> allBitmap=getBitmapByRes(allImage);
                    Bitmap bitmap = getOneBitmapByRes("a1");
                    e.onNext(bitmap);
                    e.onComplete();
                }

            }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
            //.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io())
    /*
    * 观察者者
    * */
            Observer observer = new Observer() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onNext(@NonNull Object o) {
                    Bitmap allBitmap = (Bitmap) o;
                    Log.e("收到的数据", allBitmap.toString() + "");
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onComplete() {
                    Log.e("完成", "===");
                }
            };

            @Override
            protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.e("系统时间", System.currentTimeMillis() + "");
                observable.subscribe(observer);
                Log.e("系统时间1", System.currentTimeMillis() + "");
                Toast.makeText(getApplicationContext(), "===", Toast.LENGTH_SHORT).show();
                Log.e("系统时间2", System.currentTimeMillis() + "");
                allImage = new ArrayList<>();
                allImage.add("a1");
                allImage.add("a2");
                allImage.add("a3");
                allImage.add("a4");
                allImage.add("a5");
            }

            /*
            * 根据图片的id查找图片
            * */
            private Bitmap getOneBitmapByRes(String path) {
                Bitmap bitmap = null;
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;
                options.inJustDecodeBounds = false;
                if (path.equals("a1")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a1, options);
                } else if (path.equals("a2")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2, options);
                } else if (path.equals("a3")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a3, options);
                } else if (path.equals("a4")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a4, options);
                } else {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a5, options);
                }
                return bitmap;
            }
        }
根据logcat输出可以看到,没有阻塞主线程。


主线程:

  public class MyAxTest extends Activity {
            List<String> allImage;
            /*
            * 被观察者
            * */
            Observable observable = Observable.create(new ObservableOnSubscribe() {
                @Override
                public void subscribe(@NonNull ObservableEmitter e) throws Exception {

                    //  List<Bitmap> allBitmap=getBitmapByRes(allImage);
                    Bitmap bitmap = getOneBitmapByRes("a1");
                    e.onNext(bitmap);
                    e.onComplete();
                }

            });
            //.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io())
    /*
    * 观察者者
    * */
            Observer observer = new Observer() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onNext(@NonNull Object o) {
                    Bitmap allBitmap = (Bitmap) o;
                    Log.e("收到的数据", allBitmap.toString() + "");
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onComplete() {
                    Log.e("完成", "===");
                }
            };

            @Override
            protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.e("系统时间", System.currentTimeMillis() + "");
                observable.subscribe(observer);
                Log.e("系统时间1", System.currentTimeMillis() + "");
                Toast.makeText(getApplicationContext(), "===", Toast.LENGTH_SHORT).show();
                Log.e("系统时间2", System.currentTimeMillis() + "");
                allImage = new ArrayList<>();
                allImage.add("a1");
                allImage.add("a2");
                allImage.add("a3");
                allImage.add("a4");
                allImage.add("a5");
            }

            /*
            * 根据图片的id查找图片
            * */
            private Bitmap getOneBitmapByRes(String path) {
                Bitmap bitmap = null;
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;
                options.inJustDecodeBounds = false;
                if (path.equals("a1")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a1, options);
                } else if (path.equals("a2")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2, options);
                } else if (path.equals("a3")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a3, options);
                } else if (path.equals("a4")) {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a4, options);
                } else {
                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a5, options);
                }
                return bitmap;
            }

logcat输出:可以看到主线程已经被阻塞

5.实现一个定时器---直接在主线程做处理

   //每隔两秒调用一次onNext();
        Observable observable=Observable.interval(2, TimeUnit.SECONDS).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                ;
        Observer observer=new Observer() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Object o) {
                Log.e("数据传输过来","数据传输");

            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
        observable.subscribe(observer);

定时任务-某些不能直接在主线程做的任务--引入map

 /*
    * 实现一个定时输出--模拟耗时任务
    * */
    private void timeOutPut(){
        //每隔两秒调用一次onNext();
        Observable<Bitmap> observable=Observable.interval(2, TimeUnit.SECONDS).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                .map(new Function<Long, Bitmap>() {
                    @Override
                    public Bitmap apply(@NonNull Long aLong) throws Exception {
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inSampleSize = 2;
                        options.inJustDecodeBounds = false;
                        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.a1,options);
                        return bitmap;
                    }
                })
                ;
        Observer observer=new Observer() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Object o) {
                Log.e("数据传输过来","数据传输");
                imageView.setImageBitmap((Bitmap) o);

            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
        observable.subscribe(observer);

    }


6.计数(伪)

 //以某个固定时间间隔按照增续调用onNext()方法,如这里会输出0-59;但是,如果写作60,0;将不会有操作
    Observable observable = Observable.range(60, 0);
    Observer observer = new Observer() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
            Log.e("start", "start");
        }

        @Override
        public void onNext(@NonNull Object o) {
            Log.e("当前数值", String.valueOf((int) o));
        }

        @Override
        public void onError(@NonNull Throwable e) {
            Log.e("异常", e.getMessage() + "=");
        }

        @Override
        public void onComplete() {
            Log.e("end", "end");
        }
    };
    observable.subscribe(observer);

7.延时操作,类似与handle.postdenly();

  /*
    * 实现一个延时调用
    * */
    private void YanShi() {
        Observable observable = Observable.timer(2, TimeUnit.SECONDS);
        Observer observer = new Observer() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull Object o) {
                Log.e("收到延时数据了", "==" + System.currentTimeMillis());
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
        observable.subscribe(observer);
        Log.e("开始的时间", System.currentTimeMillis() + "");
    }

8.实现一个重复操作

    /**
     * 实现一个重复操作
     */
    private void repeatDo() {
        Observable observable = Observable.just("hello").repeat();
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                if (s.equals("hello")) {
                    Log.e("收到", "收到");
                } else {
                    Log.e("收到其他数据", s);
                }
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.e("出错", e.getMessage() + "=");
            }

            @Override
            public void onComplete() {
                Log.e("end", "end");
            }
        };
        observable.subscribe(observer);
    }

9.操作符map-对传入的数据进行处理

 /*
    * AX中操作符-map
    * */
    private void doOperator() {
        //前面Observable后面的string表示我需要的数据类型,而ObservableOnSubscribe后面的integer表示我传入的数据类型
        Observable<String> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onComplete();
            }
        }).map(new Function<Integer, String>() {
            @Override
            public String apply(@NonNull Integer integer) throws Exception {
                if (integer == 1) {
                    return "OK";
                } else {
                    return "are you ok";
                }
            }
        });
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String integer) {
                Log.e("收到的数据", integer);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
        observable.subscribe(observer);
    }

10.操作符filter,过滤作用

 /*
    * AX操作符-filter--过滤作用,内部的test方法返回ture表示这个传入的参数可用,会被传递到observer中,否则就丢弃
    * */
    private void doFlaMap() {
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                e.onNext("1");
                e.onNext("2");
                e.onComplete();
            }
        }).filter(new Predicate<String>() {
            @Override
            public boolean test(@NonNull String s) throws Exception {
                if (s.equals("1")) {
                    return true;
                } else {
                    return false;
                }

            }
        }).subscribe(new Subject<String>() {
            @Override
            public boolean hasObservers() {
                return false;
            }

            @Override
            public boolean hasThrowable() {
                return false;
            }

            @Override
            public boolean hasComplete() {
                return false;
            }

            @Override
            public Throwable getThrowable() {
                return null;
            }

            @Override
            protected void subscribeActual(Observer<? super String> observer) {

            }

            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                Log.e("拿到的数据", s);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }
11.take操作符--限制传入的个数

/*
    * AX操作符-take--限制传入observer中的数据个数,如下例子,只能输出1、2
    * */
    private void doTake() {
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                e.onNext("1");
                e.onNext("2");
                e.onNext("3");
                e.onNext("4");
            }
        }).take(2).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                Log.e("收到的数据", s);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }

12.操作符-doOnNext--在数据传递给observer之前做一些操作,网上的一个例子:从服务器拿到数据,然后更改本地数据库,然后显示数据(这里的显示数据是从数据库拿到的,否则没意义)

/*
    * 操作符-doOnNext
    * */
    private void doOnNext() {
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                e.onNext("1");
                e.onComplete();
            }
        }).doOnNext(new Consumer<String>() {
            @Override
            public void accept(@NonNull String s) throws Exception {
                Log.e("第一次的数据", s);
                s = "1111111111";
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {
                Log.e("最终的数据", s);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }





待续。。。。。。










































评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值