RxJava 笔记

Posted 陈都

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

 

以上是关于RxJava 笔记的主要内容,如果未能解决你的问题,请参考以下文章

从源码的角度去探索RxJava笔记

从源码的角度去探索RxJava笔记

RxJava 笔记

使用 RxJava 将数据从 ViewModel 移动到 Fragment

RxJava入门学习笔记

使用 rxJava 和改造多次调用另一个请求中的请求