RxJava 学习使用心得

扔物线(好奇怪的名字啊)的blog 我写的这个就来自他的博客的在思考

思考

1 为什么要看 RxJava ?
答:项目越大的时候逻辑越复杂,被复杂的逻辑搞的自己写过的代码看起来都要好好想一想当时自己是怎么写出来的了。

2 为什么要学 RxJava ?
答 : 不想自己再去控制复杂的线程问题了

3 学了 RxJava 能干什么用 ?
答 :给你把刀,从此你的亿万身家就靠它了。

逻辑

  1. 我先要大概了解一下 RxJava,大概知道她都有哪些内容,
  2. 最基础写个小demo 熟悉一下用法,理解一下基础概念
  3. 理解一下的他的逻辑,拿到刀
  4. 能不能成为亿万富豪就看他了,在自己的项目中尝试加入他
    第一步 了解 RxJava

RxJava 包含三个部分 observer (观察者), observable(被观察者),subscribe(订阅桥梁的作用), 一切都在上帝的掌握之中。

首先我们来做一件事情,我从SD卡中加载图片到 imageView 中。
做这个事情之前,1 从SD卡中拿照片出来是个耗时动作,这个要放在后台来做。 2 将获得的Bitmap 放在 imageView中 这个要放在主线程中。

那我们用RxJava怎么做这件事?

我们的流程是 observable (被观察者干活的)取出bitmap 交给 subscriber(上帝 监工),subscribe() 把 bitmap 交给observer (观察者 主人)。
按照这个流程我们写的代码是

Observable.create(new Observable.OnSubscribe<Bitmap>() {
            @Override
            public void call(Subscriber<? super Bitmap> subscriber) {
                Log.d(TAG, "call");
                Bitmap bitmap = new RxLoadImage(urls[0]).create();// 取出bitmap

                subscriber.onNext(bitmap);// 交给上帝
                subscriber.onCompleted(); //干完活打报告

            }
        }).subscribe(new Observer<Bitmap>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "onCompleted");
                Toast.makeText(MainActivity.this, "图片放置完毕主人", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Bitmap bitmap) {
                Log.d(TAG, "onNext");
                mImageView1.setImageBitmap(bitmap);// 在从上帝监工那 拿bitmap

            }
        });

这里写图片描述

可以看到上面的 顺序 依次是observable -> subscribe -> observer,什么?没看懂? 好吧 ,那我们在换种方法来写,就按照上面的流程来写。

    private void mRxJava(){
//        observable 被观察者 干活的
        Observable observable = Observable.create(new Observable.OnSubscribe<Bitmap>() {
            @Override
            public void call(Subscriber<? super Bitmap> subscriber) {
                Log.d(TAG, "observable-call");
                Bitmap bitmap = BitmapFactory.decodeFile(urls[0]);// 干活拿bitmap
                subscriber.onNext(bitmap);
                subscriber.onCompleted();

            }

        });

//        subscribe 上帝
        Subscriber<Bitmap> subscriber = new Subscriber<Bitmap>() {
            @Override
            public void onCompleted() {
                Log.d("MainActivity", "subscriber-onCompleted");

            }

            @Override
            public void onError(Throwable e) {
                Log.d("MainActivity", "subscriber-onError");

            }

            @Override
            public void onNext(Bitmap bitmap) {
                Log.d("MainActivity", "subscriber-onNext");

            }
        };

//       observer 观察者 地主 只负责拿东西的
        Observer<Bitmap> observer = new Observer<Bitmap>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "observer-onCompleted");
                Toast.makeText(MainActivity.this, "活干完了", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "observer-onError");
            }

            @Override
            public void onNext(Bitmap bitmap) {
                Log.d(TAG, "observer-onNext");
                mImageView1.setImageBitmap(bitmap);
            }
        };

//       干完活将bitmap交给上帝,observer 地址从上帝那里拿到bitmap

        observable.subscribe(observer);
    }

运行之后打印log
这里写图片描述

逻辑上你会发现,我擦 完全没有subscriber 什么事啊 ? 我们看一下代码会发现 subscriber 实现了 observer的接口。

public abstract class Subscriber<T> implements Observer<T>, Subscription {
many code ...
}

Observable.from的使用

observable.from 可以从一个集合中不断的发射


    private void rxFrom() {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        Observable<Integer> integerObservable = Observable.from(list);
        integerObservable.subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "completed");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.d(TAG, "integer:----->" + integer);
            }
        });
    }

打印log

这里写图片描述

Observable.just() 的使用

 private void rxJust() {
        Observable<String> just = Observable.just(
                justTest(1)
                ,justTest(2)
                ,justTest(3)
                ,justTest(4)
                ,justTest(5)
                ,justTest(6)
                ,justTest(7)
                ,justTest(8)
                ,justTest(9)
                ,justTest(10)
        );

        just.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "completed");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
    }

    private String justTest(int i) {

        return "哈哈哈 justTest "+i;
    }

这里写图片描述

.from 和 .just 有什么区别?
待研究

Observable.empty() 的使用
不发射数据,但是可以正常结束,走completed方法。

private void rxEmpty() {
        Observable<String> just = Observable.empty(

        );

        just.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "completed");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError");
            }

            @Override
            public void onNext(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
    }

Observable.never() 的使用
不发射数据,也永远不会结束,不走 completed方法

Observable.error() 的使用
不发射数据,走 onError 方法。

 private void rxError() {
        Observable<String> just = Observable.error(
            new Throwable()
        );

        just.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "completed");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError");

            }


            @Override
            public void onNext(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });
    }
    ```
**以上这些方法用于什么场景? 我暂时也没有想到**

**PublishSubject 的使用**

private void publishSubject() {
PublishSubject stringPublishSubject = PublishSubject.create();

    stringPublishSubject.subscribe(new Observer<String>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            Log.d(TAG, s);
            Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
        }
    });

    stringPublishSubject.onNext("publishSubject");

}

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值