RxJava 在Android中的应用

  • RxJava 是什么, 能解决什么问题
  • 对比其他技术理解为什么要选择RxJava
  • RxJava的相关API
  • RxJava在Android中的典型使用场景
  • RxJava在Android中与其他框架的融合

RxJava 是什么, 能解决什么问题

  • github官方介绍:

    a library for composing asynchronous and event-based programs by using observable sequences.
    一个在运行在Java VM上的库, 通过可观测的序列来组成异步的、基于事件的程序。

  • 解决问题:

    让复杂的程序逻辑回归简单、清晰

  • RxJava 的四个基本概念:

    • Observable (可观察者/被观察者)
    • Observer (观察者/订阅者)
    • subscribe (订阅)
    • Event (事件)

如何使用

  • build.gradle引入依赖

    compile 'io.reactivex:rxandroid:1.2.0'
    compile 'io.reactivex:rxjava:1.1.4'
    
  • 源码地址

    https://github.com/ReactiveX/RxJava 
    https://github.com/ReactiveX/RxAndroid 
    

对比其他技术理解为什么要选择RxJava

  • Observable(被观察者) 和Subscriber(订阅者) 可以做任何事情

    • Observable可以是一个网络请求,Subscriber来显示请求结果;
    • Observable可以是一个数据库查询,Subscriber来显示查询结果;
    • Observable可以是按钮点击事件,Subscriber来响应点击事件;
    • Observable可以是大图片文件的加载解析, Subscriber来展示解析后的图片。

RxJava的相关API

  • Observable 可观察者/被观察者

  • Observer/Subscriber (观察者/订阅者)

  • 操作符(Operators)(常用的)

    • map 转换对象
    • flatMap 平铺对象

    - filter 过滤

    • distinct 去重复(独特的)
    • take 从开始取出固定个数
    • doOnNext 输出元素之前的额外操作
    • toList 打包对象为集合
  • Scheduler 调度器, 用于线程控制

    • Schedulers.immediate() 默认线程
    • Schedulers.newThread() 每次都创建新的线程执行
    • Schedulers.io() 包含线程池的机制, 线程个数无限, 可以复用空闲线程
    • Schedulers.computation() CPU密集计算线程, 线程池线程数和CPU数一致.处理图形运算
    • AndroidSchedulers.mainThread() Android更新界面的UI主线程
  • subscribeOn 可执行多次, 切换操作符的线程

  • observeOn 只需要执行一次, 指定订阅者执行的线程

添加java8的lambda支持

参见: https://github.com/evant/gradle-retrolambda

RxJava 使用流程

  1. 创建 Observable 被观察者
  2. 初始化被观察(订阅)后的事件序列
  3. 创建 Observer/Subscriber 观察者/订阅者
  4. 订阅 Subscribe

RxJava在Android中的典型使用场景

  • Scheduler线程切换
  • 定时任务 timer
  • 周期任务 interval
  • 合并多个请求 merge
  • 防止连续点击 throttleFirst
  • 解决回调嵌套Callback hell, flatMap
  • 其他…

RxJava在Android中与其他框架的融合 (了解)

  • RxBinding: https://github.com/JakeWharton/RxBinding

    //添加依赖
    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
    
    // 相关代码
    Button button = (Button)findViewById(R.id.bt);
    RxView.clickEvents(button) // 设置点击事件
        .subscribe(new Action1<ViewClickEvent>() {
            @Override
            public void call(ViewClickEvent event) {
                // Click handling
            }
        });  
    
  • Retrofit: https://github.com/square/retrofit

    // 添加依赖
    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
    
    // 相关代码
    new Retrofit.Builder()
                .baseUrl("http://192.168.1.113:8080/")
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(RxDemoApi.class);
    
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐