RxJava 笔记

时间:2023-03-09 18:52:39
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);