RxJava 笔记

前言

目前 RxJava 是安卓开发圈内最流行的库之一,本来准备研究研究,但看了扔物线写的《给 Android 开发者的 RxJava 详解》后,觉得生无可恋,哦不,是觉得已经写无可写。

严重推荐那篇文章,以及为了方便回顾,记了点笔记。以下所有例子均来自《给 Android 开发者的 RxJava 详解》。

再次感谢扔物线大神的文章。

RxJava配置

dependencies {
    compile ‘io.reactivex:rxandroid:1.2.1‘
    compile ‘io.reactivex:rxjava:1.1.6‘
}

使用实践

  • 创建一个 Observable

    Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
      @Override
      public void call(Subscriber<? super String> subscriber) {
          subscriber.onNext("Hello");
          subscriber.onNext("Hi");
          subscriber.onNext("Aloha");
          subscriber.onCompleted();
      }
    });
  • 快捷创建,将传入的参数依次发出
    Observable observable = Observable.just("Hello", "Hi", "Aloha");
    // 将会依次调用:
    // onNext("Hello");
    // onNext("Hi");
    // onNext("Aloha");
    // onCompleted();
  • 快捷创建,将传入的数组依次发出
    String[] words = {"Hello", "Hi", "Aloha"};
    Observable observable = Observable.from(words);
    // 将会依次调用:
    // onNext("Hello");
    // onNext("Hi");
    // onNext("Aloha");
    // onCompleted();
  • 普通 Observer
    Observer<String> observer = new Observer<String>() {
      @Override
      public void onNext(String s) {
          Log.d(tag, "Item: " + s);
      }
    
      @Override
      public void onCompleted() {
          Log.d(tag, "Completed!");
      }
    
      @Override
      public void onError(Throwable e) {
          Log.d(tag, "Error!");
      }
    };
  • scheduler 使用
    int drawableRes = ...;
    ImageView imageView = ...;
    Observable.create(new OnSubscribe<Drawable>() {
      @Override
      public void call(Subscriber<? super Drawable> subscriber) {
          Drawable drawable = getTheme().getDrawable(drawableRes));
          subscriber.onNext(drawable);
          subscriber.onCompleted();
      }
    })
    .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
    .subscribe(new Observer<Drawable>() {
      @Override
      public void onNext(Drawable drawable) {
          imageView.setImageDrawable(drawable);
      }
    
      @Override
      public void onCompleted() {
      }
    
      @Override
      public void onError(Throwable e) {
          Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
      }
    });
  • Scheduler 使用2
    Observable.just(1, 2, 3, 4) // IO 线程,由 subscribeOn() 指定
      .subscribeOn(Schedulers.io())
      .observeOn(Schedulers.newThread())
      .map(mapOperator) // 新线程,由 observeOn() 指定
      .observeOn(Schedulers.io())
      .map(mapOperator2) // IO 线程,由 observeOn() 指定
      .observeOn(AndroidSchedulers.mainThread)
      .subscribe(subscriber);  // Android 主线程,由 observeOn() 指定
  • 普通一对一变换 map()
    Observable.just("images/logo.png") // 输入类型 String
      .map(new Func1<String, Bitmap>() {
          @Override
          public Bitmap call(String filePath) { // 参数类型 String
              return getBitmapFromPath(filePath); // 返回类型 Bitmap
          }
      })
      .subscribe(new Action1<Bitmap>() {
          @Override
          public void call(Bitmap bitmap) { // 参数类型 Bitmap
              showBitmap(bitmap);
          }
      });
  • 一对多变换(将Data再转成Observable的转换)flatMap()
    Student[] students = ...;
    Subscriber<Course> subscriber = new Subscriber<Course>() {
      @Override
      public void onNext(Course course) {
          Log.d(tag, course.getName());
      }
      ...
    };
    Observable.from(students)
      .flatMap(new Func1<Student, Observable<Course>>() {
          @Override
          public Observable<Course> call(Student student) {
              return Observable.from(student.getCourses());
          }
      })
      .subscribe(subscriber);
  • 监听在 onSubscribecall 的开始执行,不要用 SubscriberonStart,因为它固定在 onSubscribe 的线程;而应该用 doOnSubscribe,它执行在离他最近的 subscribeOn 线程
    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);
时间: 2024-10-05 04:44:55

RxJava 笔记的相关文章

RxJava 学习笔记(八) --- Combining 结合操作

@(Rxjava学习笔记) RxJava 学习笔记(八) - Combining 结合操作 RxJava 学习笔记八 Combining 结合操作 StartWith 在数据序列的开头插入一条指定的项 Merge 将多个Observable合并为一个 MergeDelayError 将多个Observable合并为一个 Zip 使用一个函数组合多个Observable发射的数据集合然后再发射这个结果 CombineLatest 当两个Observables中的任何一个发射了一个数据时通过一个指定

设计模式笔记之四:MVP+Retrofit+RxJava组合使用

本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236866&idx=1&sn=da666831f67303eeb7a57c1591204b43&scene=24&srcid=0910wJAKSLdsEFTBKwKfTNor#wechat_redirect http://blog.csdn.net/qq_27778869/article/details/52121208 MVP

RxJava 学习笔记(一)

最近Android6.0的权限问题,要把之前的APP进行改造,用到了RxPermission框架!之前了解过RXJAVA,但是由于之前项目一直没有使用这个框架,所以也就一直搁置了.正好Rxpermission框架里用到了RXJAVA的内容,索性就学习了一下. 在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndr

rxJava入门学习笔记

前言 现在rx系列似乎是火的不行了,一打开群就是各种rxJava.rxAndroid. 最近正恶补各种新技术来充实自己,所以前些天写完两篇介绍JuheNews项目的文章之后,马上又开始加入了学习rxJava的阵营当中. 欢迎来到rxJava 刚开始看rxJava的系列文章的时候,一万头草泥马在心里来回奔腾:这tm跟屎一样的东西写的都是个啥?现在开始找到了一点感觉了. 网上很多大神都把rxJava看成设计模式中的观察者模式,刚开始接触它的时候,它的链式调用我反而感觉有点像建造者模式(比如Alert

RxJava 学习笔记(四)

线程控制Scheduler二 1Scheduler的API二 2Scheduler的原理二 1 subscribeOn 这边是版本110的源码 这边是版本116的源码 建议看这个 2 observeOn 3 延伸doOnSubscribe 1.线程控制Scheduler(二) 给 Android 开发者的 RxJava 详解 1)Scheduler的API(二) 前面讲到了,可以利用 subscribeOn()结合 observeOn()来实现线程控制,让事件的产生和消费发生在不同的线程.可是在

android学习笔记(2)--RxJava

紧接上一篇博文,本篇介绍RxJava,一个实现异步操作的库. RxJava最核心的两个东西是Observables和Subscribers 1.Observables(被观察者,事件源)发出一系列事件 2.Subscribers(观察者)处理这些事件 这里的事件可以是任何你感兴趣的东西(触摸事件,web接口调用返回的数据等等) 一个Observable可以发出零个或者多个事件,知道结束或者出错. 每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.o

RxJava 学习笔记(五) --- Creating 创建操作符

Create 使用一个函数从头创建一个Observable Just 将一个或多个对象转换成发射这个或这些对象的一个Observable From 将一个Iterable 一个Future 或者一个数组转换成一个Observable Defer 只有当订阅者订阅才创建Observable为每个订阅创建一个新的Observable Timer 创建一个在给定的延时之后发射单个数据的Observable Interval 创建一个按照给定的时间间隔发射整数序列的Observable Range 创建

RxJava 学习笔记(七) --- Filtering 过滤操作

Filter 只发射通过了谓词测试的数据项 OfType ofType是filter操作符的一个特殊形式它过滤一个Observable只返回指定类型的数据 Take 只发射开始的N项数据 TakeLast 只发射最后N个元素 TakeLastBuffer 将最后的N项数据当做单个数据发射 Skip 跳过开始的N项数据 SkipLast 跳过后面的N项数据 Distinct 过滤掉重复数据 DistinctUntilChanged 过滤掉连续重复的数据 ElementAt 发射第N项数据 Elem

《Android源码设计模式解析》读书笔记——Android中你应该知道的设计模式

断断续续的,<Android源码设计模式解析>也看了一遍,书中提到了很多的设计模式,但是有部分在开发中见到的几率很小,所以掌握不了也没有太大影响. 我觉得这本书的最大价值有两点,一个是从设计模式的角度去理解Android源码,结合着日常开发中的常用类,对设计模式的理解会更加的深刻:另外一个好处就是了解常用模式,再看其他人写的代码的时候,更容易理解代码思路.下面是我的读书笔记和一些思考,设计模式只整理我认为重要的部分. 建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常