Rxjava 学习总结

https://www.jianshu.com/p/52cd2d514528 RxJava的使用(三)转换——map、flatMap
https://blog.csdn.net/wenyingzhi/article/details/80453464 教你轻松理解Rxjava之线程切换流程(observeOn与subscribeOn)
http://gank.io/post/560e15be2dca930e00da1083 给 Android 开发者的 RxJava 详解
https://www.jianshu.com/p/0cd258eecf60 这可能是最好的RxJava 2.x 教程(完结版)
https://www.jianshu.com/p/88aacbed8aa5 RxJava基本原理分析
https://www.jianshu.com/p/ecfb9d68d2a2 【Android】RxJava的使用(四)线程控制 —— Scheduler
https://blog.csdn.net/briblue/article/details/52447098 RxAndroid从零开始学之三(线程调度)
https://frank909.blog.csdn.net/column/info/24684
https://frank909.blog.csdn.net/article/details/52411707 RxAndroid从零开始学习之一(RxJava的简单Demo)
https://blog.csdn.net/linchangjian_/article/details/82782397 一张图告诉你 AndroidSchedulers.mainThread() + Schedulers.io() 怎么理解和使用?
https://www.jianshu.com/p/cd3557b1a474 RxJava2.0——从放弃到入门
https://juejin.im/post/5b17560e6fb9a01e2862246f RxJava2 只看这一篇文章就够了
https://www.cnblogs.com/WoodJim/p/5970937.html RxJava简介
https://cloud.tencent.com/developer/article/1035917 彻底搞清楚 RxJava 是什么东西
https://blog.csdn.net/yalinfendou/article/details/80752021 自己动手实现RxJava
https://www.cnblogs.com/mengdd/p/6047948.html Retrofit结合RxJava使用指南
https://www.jianshu.com/p/ecfb9d68d2a2 【Android】RxJava的使用(四)线程控制 —— Scheduler
线程调度:
https://www.jianshu.com/p/12638513424f
https://blog.csdn.net/niubitianping/article/details/54952827
https://www.jianshu.com/p/9e3930fbcb26
https://www.jianshu.com/p/3b99f3f58ffd
https://www.jianshu.com/p/b037dbae9d8f
https://www.jianshu.com/p/30e13d874a61

https://www.jianshu.com/p/7687365aa946 Retrofit网络请求参数注解,@Path、@Query、@QueryMap…
Rxjava1
app gradle中添加如下依赖

implementation 'io.reactivex:rxjava:1.0.14'
implementation 'io.reactivex:rxandroid:1.0.1'

RxJava在不指定线程的情况下,发起时间和消费时间默认使用当前线程。
subscribeOn():指定subscribe()所发生的线程,即Observable.OnSubscribe被激活时所处的线程,或者叫做事件产生的线程。subscribeOn()的位置放在哪里都可以,但它是只能调用一次(第一次调用的才有用)。不过,可以在Observable.doOnSubscribe()后使用subscribeOn()来指定subscribe()时,执行doOnSubscribe()所在线程。
observeOn():指定Subscriber 所运行在的线程。或者叫做事件消费的线程。其实,observeOn() 指定的是它之后的操作所在的线程,即链式调用过程中,此句代码(observeOn(xx.xx))之后的代码所运行在的线程
https://blog.csdn.net/jdsjlzx/article/details/51607875
线程调度器 Scheduler

Scheduler:线程控制器,可以指定每一段代码在什么样的线程中执行。 
模拟一个需求:新的线程发起事件,在主线程中消费
Observable.just("Hello", "Word")
                .subscribeOn(Schedulers.newThread())//指定 subscribe() 发生在新的线程
                .observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回调发生在主线程
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });

上面用到了subscribeOn(),和observeOn()方法来指定发生的线程和消费的线程。

多次切换线程

看完上面的介绍想必对RxJava线程的切换有了一些理解,上面只是对事件的发起和消费制定了线程。如果中间有map之类的操作呢?是否可以实现发起的线程在新线程中,map的处理在IO线程,最后的消费在主线程中。

Observable.just("Hello", "Wrold")
                .subscribeOn(Schedulers.newThread())//指定:在新的线程中发起
                .observeOn(Schedulers.io())         //指定:在io线程中处理
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        return handleString(s);       //处理数据
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())//指定:在主线程中处理
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        show(s);                       //消费事件
                    }
                });
可以看到observeOn()被调用了两次,分别指定了map的处理的现场和消费事件show(s)的线程。

若将observeOn(AndroidSchedulers.mainThread())去掉会怎么样?不为消费事件show(s)指定线程后,show(s)会在那里执行? 
其实,observeOn() 指定的是它之后的操作所在的线程。也就是说,map的处理和最后的消费事件show(s)都会在io线程中执行。 
observeOn()可以多次使用,可以随意变换线程

默认情况下rxjava中生产者和订阅者都是在当前线程中执行。Scheduler就是用来切换生产者和订阅者执行的线程。
https://blog.csdn.net/a910626/article/details/79298356
subscribeOn指定subscribe()所发生的线程,或者叫做事件产生的线程
observeOn 指定 Subscriber 所运行在的线程,或者叫做事件消费的线程

//new Observable.just()执行在新线程
  Observable.create(new Observable.just(getFilePath())
          .subscribeOn(Schedulers.newThread()) // //指定在新线程中创建被观察者,第一个subscribeOn指定的事件源发生线程
          .observeOn(Schedulers.io()) //将接下来执行的线程环境指定为io线程
          .map(mMapOperater)     //map就处在io线程
          .observeOn(AndroidSchedulers.mainThread())  //将后面执行的线程环境切换为主线程,但是这一句依然执行在io线程
          .subscribeOn(Schedulers.io()) //指定事件源发生的线程无效<但这句代码本身执行在主线程>,当有多个subscribeOn指定事件源发生线程的时候,只有第一个subscribeOn指定的事件源才起作用
          .subscribe(mSubscriber);    //执行在主线程<离这个最近的observeOn指定的事件处理线程是main线程>

Observable
                .create(new Observable.OnSubscribe<Integer>() {
                    @Override
                    public void call(Subscriber<? super Integer> subscriber) {
                        //main
                        Log.i(TAG, "OnSubscribe call method in thread: " + Thread.currentThread().getName());
                        subscriber.onNext(1);
                    }
                })
                .subscribeOn(Schedulers.io())
                .map(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer) {
                        //io
                        Log.i(TAG, "map call method in thread: " + Thread.currentThread().getName());
                        return integer;
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .observeOn(Schedulers.io())
                .map(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer) {
                        //io
                        Log.i(TAG, "map call method in thread: " + Thread.currentThread().getName());
                        return integer;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer) {
                        //main
                        Log.i(TAG, "map call method in thread: " + Thread.currentThread().getName());
                        return integer;
                    }
                })
                .observeOn(Schedulers.io())
                .map(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer) {
                        //io
                        Log.i(TAG, "map call method in thread: " + Thread.currentThread().getName());
                        return integer;
                    }
                })
                .observeOn(Schedulers.newThread())
                .map(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer) {
                        //main
                        Log.i(TAG, "map method in thread: " + Thread.currentThread().getName());
                        return integer;
                    }
                })
                .observeOn(Schedulers.computation())
                .map(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer) {
                        //main
                        Log.i(TAG, "map method in thread: " + Thread.currentThread().getName());
                        return integer;
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1<Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer) {
                        //main
                        Log.i(TAG, "map method in thread: " + Thread.currentThread().getName());
                        return integer;
                    }
                })
                .observeOn(Schedulers.io())
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        //io
                        Log.i(TAG, "map method in thread: " + Thread.currentThread().getName());
                        System.out.print(integer + '\n');
                    }
                });

以及参数Scheduler,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。
  • AndroidSchedulers.mainThread():它指定的操作将在 Android 主线程运行。

链接:https://www.jianshu.com/p/ecfb9d68d2a2

Android异步框架RxJava 1.x系列(三) - 线程调度器Scheduler https://blog.csdn.net/baidu_22254181/article/details/81066449
subscribeOn() 的线程切换发生在 OnSubscribe 中,即在它通知上一级 OnSubscribe 时,这时事件还没有开始发送,因此 subscribeOn() 的线程控制只能在事件发出的开端造成影响,即只允许一次线程切换。

observeOn() 的线程切换则发生在它内建的 Subscriber 中,即发生在它即将给下一级 Subscriber 发送事件时,因此 observeOn() 控制的是它后面的线程,允许多次线程切换。

与 Subscriber.onStart() 相对应的,有一个方法 Observable.doOnSubscribe()。它和 Subscriber.onStart() 同样是在 subscribe() 调用后而且在事件发送前执行,但区别在于它可以指定线程。默认情况下,doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。

原文:https://blog.csdn.net/baidu_22254181/article/details/81066449

Observable.create(onSubscribe)
    .subscribeOn(Schedulers.io())
    .doOnSubscribe(new Action0() {
        @Override
        public void call() {
            // 需要在主线程执行
            progressBar.setVisibility(View.VISIBLE); 
        }
    })
    .subscribeOn(AndroidSchedulers.mainThread()) 
    // 指定主线程
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(subscriber);
Observable.just(student1, student2, student2)
                //使用map进行转换,参数1:转换前的类型,参数2:转换后的类型
                .map(new Func1<Student, String>() {
                    @Override
                    public String call(Student i) {
                        String name = i.getName();//获取Student对象中的name
                        return name;//返回name
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        nameList.add(s);
                    }
                });

https://www.jianshu.com/p/52cd2d514528

所有的业务代码都是在subscribe()调用以后才会执行的 https://www.jianshu.com/p/88aacbed8aa5
https://blog.csdn.net/yankebin/article/details/80844891 RxJava2探索-线程切换原理之subscribeOn

Rxjava2
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0907/6604.html RxJava2 浅析
https://blog.csdn.net/weixin_34232617/article/details/87983546 RxJava1 升级到 RxJava2 所踩过的坑
https://www.jianshu.com/p/a5dbab3068c8 RxJava 2.x.y与Retrofit结合使用出现时出现无法创建Observable
更新于2019年6月30日 云台山 7贤宾馆

Rxjava1

Observable
                        .create(new Observable.OnSubscribe<Integer>() {
                            @Override
                            public void call(Subscriber<? super Integer> subscriber) {
                                Log.i(TAG, "OnSubscribe call method in thread: " + Thread.currentThread().getName());
                                subscriber.onNext(1);
                            }
                        })
                        //.subscribeOn(AndroidSchedulers.mainThread())
                        .subscribeOn(Schedulers.io())
                        .map(new Func1<Integer, Integer>() {
                            @Override
                            public Integer call(Integer integer) {
                                Log.w(TAG, "1 map call method in thread: " + Thread.currentThread().getName());
                                return integer;
                            }
                        })
                        //.observeOn(AndroidSchedulers.mainThread())
                        .map(new Func1<Integer, Integer>() {
                            @Override
                            public Integer call(Integer integer) {
                                Log.w(TAG, "7 map method in thread: " + Thread.currentThread().getName());
                                return integer;
                            }
                        })
                        //.observeOn(Schedulers.io())
                        .observeOn(Schedulers.immediate())
                        .subscribe(new Subscriber<Integer>() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onNext(Integer integer) {
                                //io
                                Log.d(TAG, "8 subscribe method in thread: " + Thread.currentThread().getName());
                                System.out.print(integer + '\n');
                            }
                        });

Rxjava2

Observable
                        .create(new ObservableOnSubscribe<Integer>() {
                            @Override
                            public void subscribe(ObservableEmitter<Integer> subscriber) {
                                Log.i(TAG, "OnSubscribe call method in thread: " + Thread.currentThread().getName());
                                subscriber.onNext(1);
                            }
                        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值