大话 RxJava 核心原理

本文通过讲述警察队长和警察的故事,阐述了Java中如何使用泛型和观察者模式进行任务的分配和线程间的切换,强调了主线程与子线程的协作以及使用Handler保证UI线程的响应性。
摘要由CSDN通过智能技术生成

先说一个故事,带着故事看代码更有带入感。

警察队长,(每次执行的任务他也不知道具体是什么任务,用泛型)

每次在执行任务的时候,都需要创建一个新的警察+线人的组合

警察 + 中间人(就是观察者)(需要将中间人给到队长,队长在下发任务的时候,告诉中间人,中间人---》最后话带到)

泛型如果转化。假如现在队长,叫抓的是 A ,但是呢,A 的照片太模糊了,根本看不出来相貌 。当前在执行任务的警察
呢只要看见你,长的像的就抓住,交给他的下级就抓了 B,这样下级线人只知道要抓的人就是 B,给押送回去了 ,压根不知道队长给的是A
这样就完成了,泛型转化。所以要考虑抓犯人的过程是比较耗时的,需要放到子线程中。

(主线程就好比是吃饱饭的线人,子线程就是没有吃饱饭的线人,警队对线人有严格的管理制度,只要有线人不吃饭那么所有线人都不能吃)
线程切换,队长在往下发任务给,线人的时候,下级给到上级的线人就是没有吃饭的。那么基本上在这一条任务上面所有的线人都是没有吃饭在
干活的。(这个发生在把线人交给上级的时候,线人就提前是个什么状态,这个就是发生在 观察者上溯期间完成)这个时候,来了一个领导警察
看见线人都是在饿肚子,他就发话了先吃饭,吃饱了再干活,这个饭就是 Handler。于是乎这个警察在把任务交给下一个线人的时候,都是吃饱
饭的,这样就从没有吃饱到吃饱饭的转化,也就是从子线程到主线程的转化。

上级持有下级的引用(中间人,就是这个观察者),结合图可能会更好的理解一点。

上代码(警察队长和警察的故事情节代码实现)

public abstract class Observable<T> {
    public static <T> Observable<T> create(Observable<T> observable) {
        return observable;
    }

    public Observable<T> flatMap() {
        return new Observable<T>() {
            @Override
            public void subscribe(Observer<T> observer) {
                Observer<T> observerB = new Observer<T>() {
                    @Override
                    public void onNext(T t) {
                        observer.onNext(t);
                    }

                    @Override
                    public void onComplete() {
                        observer.onComplete();
                    }

                    @Override
                    public void onError(Throwable e) {
                        observer.onError(e);
                    }
                };
                Observable.this.subscribe(observerB);
            }
        };
    }

    public <R> Observable<R> map(Fun1<T, R> fun1) {
        return new Observable<R>() {
            @Override
            public void subscribe(Observer<R> observer) {
                Observer<T> observerB = new Observer<T>() {
                    @Override
                    public void onNext(T t) {
                        R r = fun1.call(t);
                        observer.onNext(r);
                    }

                    @Override
                    public void onComplete() {
                        observer.onComplete();
                    }

                    @Override
                    public void onError(Throwable e) {
                        observer.onError(e);
                    }
                };
                Observable.this.subscribe(observerB);
            }
        };
    }

    public Observable<T> switchThread() {
        return new Observable<T>() {
            @Override
            public void subscribe(Observer<T> observer) {
                new Thread() {
                    @Override
                    public void run() {
                        Observer<T> observerB = new Observer<T>() {
                            @Override
                            public void onNext(T t) {
                                observer.onNext(t);
                            }

                            @Override
                            public void onComplete() {
                                observer.onComplete();
                            }

                            @Override
                            public void onError(Throwable e) {
                                observer.onError(e);
                            }
                        };
                        Observable.this.subscribe(observerB);
                    }
                }.start();
            }
        };
    }

    private final Handler mHandler = new Handler(Looper.getMainLooper());

    public Observable<T> switchMain() {
        return new Observable<T>() {
            @Override
            public void subscribe(Observer<T> observer) {
                Observer<T> observerB = new Observer<T>() {
                    @Override
                    public void onNext(T t) {
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                observer.onNext(t);
                            }
                        });

                    }

                    @Override
                    public void onComplete() {

                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                observer.onComplete();
                            }
                        });
                    }

                    @Override
                    public void onError(Throwable e) {
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                observer.onError(e);
                            }
                        });
                    }
                };
                Observable.this.subscribe(observerB);
            }
        };
    }

    /**
     * 订阅一个观察者
     *
     * @param observer
     */
    public abstract void subscribe(Observer<T> observer);

}

看执行效果(发消息,切换线程,任务完成)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 警察队长一开始是不知道具体任务的,<String> 就是给的具体任务
        Observable.create(new Observable<String>() {
                    @Override
                    public void subscribe(Observer<String> observer) {
                        Log.i("TTTTT", "1subscribe: " + Thread.currentThread().getName());
                        observer.onNext("我们要执行一个重要的任务,请告诉你下面线人通知下去");
                    }
                })
                .map(new Fun1<String, Bitmap>() { // 把线人交给自己的上级
                    @Override
                    public Bitmap call(String s) {
                        // 抓犯人,用自己的具体方式去抓。
                        Log.i("TTTTT", "收到上级的任务 (" + s + ")" + Thread.currentThread().getName());
                        return null;
                    }
                }).switchThread()// 没有吃饭的线人从这个地方产生
                .map(new Fun1<Bitmap, Bitmap>() {
                    @Override
                    public Bitmap call(Bitmap bitmap) {
                        Log.i("TTTTT", "4subscribe: " + Thread.currentThread().getName());
                        return null;
                    }
                }).switchMain()// 善良的警察,让线人吃饱,是从这里开始
                .subscribe(new Observer<Bitmap>() {
                    @Override
                    public void onNext(Bitmap bitmap) {
                        Log.i("TTTTT", "3subscribe: " + Thread.currentThread().getName());
                    }

                    @Override
                    public void onComplete() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }
                });
    }

执行效果(任务完成)

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值