RxJava操作符——Observable.create

使用

通过Observable.create()方法传入一个Observable.OnSubscribe对象来创建Observable

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("野猿新一");
        subscriber.onCompleted();
    }
}).subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        Log.d("Himmy", s);
    }
});

RxJava的核心就是响应式编程,下面这段示例能让你更好地理解什么是响应式

通过Observable.create()创建了一个Observable,封装了一个按钮的点击事件监听。

当按钮点击的时候调用subscriber.onNext发送事件,这样在Observer的onNext中可以接受处理该事件。

当按钮点击5次后,调用subscriber.onCompleted结束事件的订阅,回调Observer的onCompleted方法,之后再点击按钮该Observer也不会再接收到事件

每当按钮点击一次,事件源Observable就发送一次事件,订阅者Observer就接收到该事件做相关处理,这就是响应式编程

Observable<Integer> observable = Observable.create(new Observable.OnSubscribe<Integer>() {
    private int count;
    @Override
    public void call(final Subscriber<? super Integer> subscriber) {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                subscriber.onNext(++count);
                if (count == 5) {
                    subscriber.onCompleted();
                }
            }
        });
    }
});

observable.subscribe(new Observer<Integer>() {
    @Override
    public void onNext(Integer integer) {
        Log.d("Himmy", "onClick:" + integer);
    }

    @Override
    public void onCompleted() {
        Log.d("Himmy", "onCompleted");
    }

    @Override
    public void onError(Throwable e) {
        Log.d("Himmy", "onError");
    }
});

通过Observable.create你可以创建任何同步的或者异步的事件源。比如说封装一个网络请求、数据库处理、文件读写等。

如下伪代码演示封装一个网络请求创建一个Observable

Observable.create(new Observable.OnSubscribe<UserInfo>() {
    @Override
    public void call(final Subscriber<? super UserInfo> subscriber) {
        HttpClient.getUserInfo(new HttpCallback() {
            @Override
            public void onSuccess(UserInfo info) {
                subscriber.onNext(info);
                subscriber.onCompleted();
            }

            @Override
            public void onError(Exception e) {
                subscriber.onError(e);
            }
        });
    }
});

源码解析

RxJva现在已经更新到了3.0.0,整个项目的代码量和复杂度都增加不少,为了降低理解难度,本文解析的是RxJava1.0.0的源码,其核心原理是一样的,为了便于理解,会删除源码中一些不相关的代码,或者以伪代码的形式展示

create方法内部其实就是新建一个Observable,参数为用户自己实现的OnSubscribe

public final static <T> Observable<T> create(OnSubscribe<T> f) {
    return new Observable<T>(f);
}

 传入的OnSubscribe被Observable内部持有,在调用subscribe方法的时候会用到

public class Observable<T> {

    final OnSubscribe<T> onSubscribe;

    protected Observable(OnSubscribe<T> f) {
        this.onSubscribe = f;
    }
}

 再看Observable.subscribe()方法,里面调用了之前传入的OnSubscribe对象的call()方法,暂且叫这个步骤叫做开启事件源吧。

public final Subscription subscribe(Subscriber<? super T> subscriber) {
    try {
        // 省略其他代码
        onSubscribe.call(subscriber);
        // 省略其他代码
        return subscriber;
    } catch (Throwable e) {
        // 省略其他代码
    }
}

总结

  • 通过Observable.create创建Observable
  • create方法需出入一个实现call方法的Observable.OnSubscribe对象
  • call方法中通过调用subscriber.onNext来发送事件
  • call方法中通过调用subscriber.onCompleted结束事件订阅
  • call方法中通过调用subscriber.onError来抛出异常
  • onCompleted和onError是互斥的
发布了287 篇原创文章 · 获赞 44 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/mqdxiaoxiao/article/details/104354692