RxJava系列之手写切换线程

系列文章

RxJava系列之简介和观察者设计模式
RxJava系列之上游与下游
RxJava系列之常用创建型操作符
RxJava系列之常用变换操作符
RxJava系列之常用过滤操作符
RxJava系列之常用条件操作符
RxJava系列之常用合并操作符
RxJava系列之常用异常操作符
RxJava系列之线程切换实战
RxJava系列之背压模式
RxJava系列之配合Retrofit
RxJava系列之泛型高级
RxJava系列之手写create操作符
RxJava系列之手写create操作符增加泛型限定
RxJava系列之手写just操作符
RxJava系列之手写map操作符
RxJava系列之手写切换线程

切换线程

在上游和下游之间增加切换线程的操作,如果手写map操作符明白的话, 这里就很简单。

使上游执行在子线程的ObservableOnSubscribe的子类

// 上游处理 异步线程的  Observable的子类   [给所有上游 切换异步线程]
public class ObservableOnIO<T>  implements ObservableOnSubscribe<T>{

    // 线程池
    private final static ExecutorService EXECUTOR_SERVICE = Executors.newCachedThreadPool();

    // 拿到上一层
    private ObservableOnSubscribe<T> source;

    public ObservableOnIO(ObservableOnSubscribe<T> source) {
        this.source = source;
    }

    @Override
    public void subscribe(final Observer<? super T> observableEmitter) {
       // source.subscribe(observableEmitter); // 是主线程

        // 用线程池的目的,是为了让 所有上游 全部都在 线程池中 异步运行
        EXECUTOR_SERVICE.submit(new Runnable() {
            @Override
            public void run() {
                source.subscribe(observableEmitter); // 线程池里面所执行的了
            }
        });
    }
}

就是在调用上游的source.subscribe方法的时候,放在子线程执行。

使下游执行在主线程的ObservableOnSubscribe的子类

// [给所有下游 切换Android主线程线程]
public class ObserverAndroidMain_On<T> implements ObservableOnSubscribe<T>{

    // 拿到上一层
    private ObservableOnSubscribe<T> source;

    public ObserverAndroidMain_On(ObservableOnSubscribe<T> source) {
        this.source = source;
    }

    @Override
    public void subscribe(Observer<? super T> observableEmitter) { // == Observer
        // 包裹是为了,往下执行的时候,优先执行我们的 包裹
        PackageObserver<T> packageObserver = new PackageObserver(observableEmitter);
        // 把包裹交给source
        source.subscribe(packageObserver);
    }

    // 包裹一层   Observer
    private final class PackageObserver<T> implements Observer<T> {

        // 拿到上一层
        // private ObservableOnSubscribe<T> source;

        // 拥有下一层的能力
        // private Function<T, R> function; // 不用读写模式
        private Observer<T> observer; // 临时存储一份

        public PackageObserver(Observer<T> observer) {
            // this.source = source;
            // this.function = function;
            this.observer = observer;
        }

        @Override
        public void onSubscribe() {}

        @Override
        public void onNext(final T item) {
            // Handler
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    // 变成 Android main线程
                    observer.onNext(item);
                }
            });
        }

        @Override
        public void onError(final Throwable e) {
            // Handler
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    // 变成 Android main线程
                    observer.onError(e);
                }
            });
        }

        @Override
        public void onComplete() {
            // Handler
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    // 变成 Android main线程
                    observer.onComplete();
                }
            });
        }
    }
}

在接收到上游事件的时候,发射到下游之前,先切换到主线程。这样下游的所有事件都是在主线程接收到了。

测试代码

 // todo 打印 上游 下游 线程
    public void test2(View view) {
        // 最顶端
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(Observer<? super Integer> observableEmitter) {
                Log.d(TAG, "上游 subscribe: --- " + Thread.currentThread().getName());
                observableEmitter.onNext(1);
            }
        })
        .map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) {
                Log.d(TAG, "map 1  --- " + Thread.currentThread().getName());
                return integer + ">>>";
            }
        })
        .map(new Function<String, String>() {
            @Override
            public String apply(String s) {
                Log.d(TAG, "map 2  --- " + Thread.currentThread().getName());
                return s + "???";
            }
        })

        // 给上游分配异步线程
        .observables_On()

        // 给下游分配Android主线程
        // new Observable<T>(下游分配异步线程 == ObservableOnIO).xxx
        .observers_AndroidMain_On()

        // main线程.订阅
        // new Observable<T>(下游分配Android主线程 == ObserverAndroidMain_On).订阅
        .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe() {

            }

            @Override
            public void onNext(String item) {
                Log.d(TAG, "下游 onNext: --- " + Thread.currentThread().getName());
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }

使用手写的RxJava加载网路图片

 // todo 用我们自己写的RxJava下载图片  异步下载 线程切换 更新UI
    public void test3(View view) {

        final String PATH = "http://img.redocn.com/sheying/20140731/qinghaihuyuanjing_2820969.jpg";

        Observable.just(PATH)
                .map(new Function<String, Bitmap>() {
                    @Override
                    public Bitmap apply(String s) {
                        try {
                            Thread.sleep(2000);
                            URL url = new URL(PATH);
                            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                            httpURLConnection.setConnectTimeout(5000);
                            int code = httpURLConnection.getResponseCode();
                            if (code == HttpURLConnection.HTTP_OK) {
                                InputStream inputStream = httpURLConnection.getInputStream();
                                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                                return bitmap;
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            // 关闭流  系统资源
                        }
                        return null;
                    }
                })

                // 给图片加水印
                .map(new Function<Bitmap, Bitmap>() {
                    @Override
                    public Bitmap apply(Bitmap bitmap) {
                        Paint paint = new Paint();
                        paint.setColor(Color.RED);
                        paint.setTextSize(80);
                        return drawTextToBitmap(bitmap, "RxJava直播课 手写线程切换", paint, 80, 80);
                    }
                })

                // 给上游分配异步线程 下载图片
                .observables_On()

                // 给下游分配主线程 更新UI
                .observers_AndroidMain_On()

                .subscribe(new Observer<Bitmap>() {
                    @Override
                    public void onSubscribe() {
                        progressDialog = new ProgressDialog(MainActivity.this);
                        progressDialog.setMessage("正在下载中...");
                        progressDialog.show();
                    }

                    @Override
                    public void onNext(Bitmap item) {
                        imageView.setImageBitmap(item);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        if (progressDialog != null) progressDialog.dismiss();
                    }
                });

    }


    //图片上绘制文字
    private Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, int paddingLeft, int paddingTop) {
        Bitmap.Config bitmapConfig = bitmap.getConfig();

        paint.setDither(true); // 获取跟清晰的图像采样
        paint.setFilterBitmap(true);// 过滤一些
        if (bitmapConfig == null) {
            bitmapConfig = Bitmap.Config.ARGB_8888;
        }
        bitmap = bitmap.copy(bitmapConfig, true);
        Canvas canvas = new Canvas(bitmap);

        canvas.drawText(text, paddingLeft, paddingTop, paint);
        return bitmap;
    }

总结

切换线程和map变换操作符很类似,都是拦截了上下游之间的直接引用,从而在中间做处理。如果这里看不明白,可以到手写map变换操作符中仔细学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值