Rxjava学习笔记(一)

RxJava 2.0

要在Android中使用RxJava2, 先添加Gradle配置:

compile ‘io.reactivex.rxjava2:rxjava:2.0.1’
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’

rxjava

简单使用姿势:

        //1.创建被观察者
        Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(11);
                e.onNext(8);
                e.onComplete();
            }

        });

        //2.创建观察者
        Observer<Integer> observer = new Observer<Integer>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.i(TAG, "onSubscribe: ");
            }

            @Override
            public void onNext(Integer value) {
                Log.i(TAG, "onNext: " + value);
            }

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

            @Override
            public void onComplete() {
                Log.i(TAG, "onComplete: ");
            }

        };

        //3.观察者 进入 被观察者的订阅
        observable.subscribe(observer);

链式调用:

        //链式调用
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(1);
                e.onNext(2);
                e.onNext(3);
                e.onNext(11);
                e.onNext(8);
                e.onComplete();
            }
        }).subscribe(new Observer<Integer>() {
                         @Override
                         public void onSubscribe(Disposable d) {
                             Log.i(TAG, "onSubscribe: ");
                         }

                         @Override
                         public void onNext(Integer value) {
                             Log.i(TAG, "onNext: " + value);
                         }

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

                         @Override
                         public void onComplete() {
                             Log.i(TAG, "onComplete: ");
                         }
                     }
        );

执行结果:

12-29 22:05:25.654 8416-8416/tyl.rxjavap I/rxjavaTest: onSubscribe:

22:05:25.654 8416-8416/tyl.rxjavap I/rxjavaTest: onNext: 33 12-29

22:05:25.654 8416-8416/tyl.rxjavap I/rxjavaTest: onNext: 48 12-29

22:05:25.654 8416-8416/tyl.rxjavap I/rxjavaTest: onNext: 265 12-29

22:05:25.654 8416-8416/tyl.rxjavap I/rxjavaTest: onComplete:

执行顺序onSubscribe->onNext->onComplete/onError;

  • ObservableEmitter: Emitter是发射器的意思,那就很好猜了,这个就是用来发出事件的,它可以发出三种类型的事件,通过调用emitter的onNext(T value)onComplete()onError(Throwable error)就可以分别发出next事件、complete事件和error事件。

注意点:

  • 上游可以发送无限个onNext, 下游也可以接收无限个onNext.
    onNext
  • 当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
    发送onComplete()
  • 当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
    发送onError
  • 上游可以不发送onComplete或onError.
  • 最关键的是onComplete和onError必须唯一并且互斥(onComplete或onError之后下游不会继续接收事件

  • Disposable相当于RxJava1.x中的Subscription,用于解除订阅(可理解为切断水管,水依旧还在流,但是流不到下游)。

    如果在请求的过程中Activity已经退出了, 这个时候如果回到主线程去更新UI, 那么APP肯定就崩溃了。我可以调用Disposable的dispose()方法切断水管, 使得下游收不到事件, 既然收不到事件, 那么也就不会再去更新UI了. 因此我们可以在Activity中将这个Disposable 保存起来, 当Activity退出时, 切断它即可.
    
    那如果有多个Disposable 该怎么办呢? RxJava中已经内置了一个容器CompositeDisposable, 每当我们得到一个Disposable时就调用CompositeDisposable.add()将它添加到容器中, 在退出的时候, 调用CompositeDisposable.clear() 即可切断所有的水管.
    

常用subscribe方法


线程控制

基本使用姿势

Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                Log.i(TAG, "subscribe:  currentThread is :" + Thread.currentThread().getName());
                e.onNext(1);

                e.onComplete();
            }
        })      // 指定上游线程
                .subscribeOn(Schedulers.newThread())//新线程
                .doOnNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "accept 1: "  + " currentThread is :" + Thread.currentThread().getName());
                    }
                })
                .subscribeOn(Schedulers.io())//io线程
                .doOnNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "accept 2: " + " currentThread is :" + Thread.currentThread().getName());
                    }
                })
                //指定下游线程
                .observeOn(AndroidSchedulers.mainThread())//主线程
                .doOnNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "accept 3: " + " currentThread is :" + Thread.currentThread().getName());
                    }
                })
                .observeOn(Schedulers.io())
                .doOnNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i(TAG, "accept 4: " +  " currentThread is :" + Thread.currentThread().getName());
                    }
                })
                .subscribe(new Consumer<Integer>() {
                               @Override
                               public void accept(Integer integer) throws Exception {
                                   Log.i(TAG, "Consumer accept: " + " currentThread is :" + Thread.currentThread().getName());
                               }
                           }
                );
    }

控制台输出:

subscribe: currentThread is :RxNewThreadScheduler-1

accept 1: currentThread is :RxNewThreadScheduler-1

accept 2: currentThread is :RxNewThreadScheduler-1

accept 3: currentThread is :main accept 4: currentThread is
:RxCachedThreadScheduler-2

Consumer accept: currentThread is :RxCachedThreadScheduler-2

  • subscribeOn(Scheduler scheduler)只能指定一次
  • observeOn(Scheduler scheduler)可指定多次,每调用一次observeOn() 线程便会切换一次

    内置线程:

    • Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
    • Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作
    • Schedulers.newThread() 代表一个常规的新线程
    • AndroidSchedulers.mainThread() 代表Android的主线程

Todo: DoOnNext()方法里做数据比对和缓存处理?

参考资料(十分感谢大神们的博客)
@Season-给初学者的RxJava2.0教程
@扔物线 -给 Android 开发者的 RxJava 详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你输出一篇Selenium学习笔记。以下是一份简单的学习笔记供参考: Selenium学习笔记 Selenium是一款用于自动化Web应用程序测试的强大工具。它提供了一组丰富的API,可以与各种编程语言(如Python、Java、C#等)结合使用,以实现Web应用程序的自动化测试。 1. 安装和配置 首先,你需要安装Selenium库。如果你使用Python,可以使用以下命令安装: ``` pip install selenium ``` 安装完成后,你还需要下载并配置相应的浏览器驱动程序。Selenium支持各种浏览器,如Chrome、Firefox、Safari等。你可以在Selenium官方网站上找到相应的驱动程序下载链接。 2. 基本操作 Selenium提供了一系列方法来模拟用户在浏览器中的操作,如打开URL、点击元素、输入文本等。以下是一些常用的基本操作示例: - 打开浏览器并访问URL: ```python from selenium import webdriver driver = webdriver.Chrome() # 使用Chrome浏览器驱动 driver.get("https://www.example.com") # 打开指定URL ``` - 查找元素并操作: ```python element = driver.find_element_by_id("element_id") # 根据元素ID查找 element.click() # 点击元素 input_element = driver.find_element_by_name("input_name") # 根据元素名称查找 input_element.send_keys("Hello, World!") # 输入文本 ``` - 执行JavaScript代码: ```python driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滚动到页面底部 ``` 3. 高级操作 Selenium还提供了一些高级操作,如处理弹窗、切换窗口、等待元素加载等。以下是一些常用的高级操作示例: - 处理弹窗: ```python alert = driver.switch_to.alert # 切换到弹窗 alert.accept() # 接受弹窗 confirm = driver.switch_to.alert # 切换到确认框 confirm.dismiss() # 取消确认框 ``` - 切换窗口: ```python window_handles = driver.window_handles # 获取所有窗口句柄 driver.switch_to.window(window_handles[-1]) # 切换到最后一个窗口 ``` - 等待元素加载: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "element_id")) ) ``` 4. 测试框架 Selenium还可以与测试框架(如Pytest、JUnit等)结合使用,以便更好地组织和管理测试用例。你可以使用测试框架提供的断言方法来验证测试结果。 ```python import pytest def test_example(): driver = webdriver.Chrome() driver.get("https://www.example.com") assert "Example Domain" in driver.title # 断言页面标题包含指定文本 driver.quit() ``` 以上是一份简单的Selenium学习笔记,希望对你有所帮助。当然,Selenium还有很多其他功能和用法,你可以进一步深入学习和探索。祝你学习愉快!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值