RxJava学习(一)

参考:http://gank.io/post/560e15be2dca930e00da1083

Rx的意思是响应式扩展,RXJava是基于观察者模式的一种编程模型,作用就是提供了一致的编程接口,方便开发者处理异步数据流

1、使用

https://github.com/ReactiveX/RxJava 

https://github.com/ReactiveX/RxAndroid

 
   compile 'io.reactivex:rxandroid:1.2.1'
// Because RxAndroid releases are few and far between, it is recommended you also
// explicitly depend on RxJava's latest version for bug fixes and new features.
    compile 'io.reactivex:rxjava:1.1.6'

2.例子

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("hello");
    }
}).subscribe(new Subscriber<String>() {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onNext(String s) {
        Log.d("rx", s);
    }
});
输出结果为

D/rx: hello

3、基本概念:

Observable(被观察着,如Button按钮)

Observer(观察者,如onClickListener实现类)

subscribe(订阅,如setOnClickListener)

事件(event,如onCLick)

4、Rxjava中的事件

onNext event事件

onComplete 没有新的onNext发出时,调用onComplete

onError 事件处理异常时调用,并停止队列,接下来没有任何事件

5、实现

5.1.Observer,观察者,他决定了事件响应的行为

Subscriber,订阅者,实现了Observer的抽象类,增加了onStart,unSubscribe等方法,

onStart:在Subscribe刚开始,还没有事件的时候调用,他是在subscribe方法所在的线程中被调用

unSubscribe,解除订阅,在解除之前可以先判断一下isUnSubscribed,这个方法会解除Observable对Subscriber的引用

5.2.Observable被观察者,他决定了什么时候触发事件(调用时机),以及触发怎样的事件(setOnClick,setOnLongClick)

通过Observable.create方法创建observable对象并定义事件触发规则(触发规则在onSubscribe中的call方法实现),还有just(T...)方法(将传入的参数依次发送出去),from(T[] )/from(Iterable<? extends T>)(将传入的数组或迭代器拆成具体对象依次发送出去)

5.3subscribe订阅

通过Observable的subscribe方法将观察者和被观察者联系起来,内部subscribe方法是通过subscriber/observer调用onStart方法做些初始化工作,然后调用onSubscribe的call方法,并返回订阅者或观察者,以方便取消订阅。

整体图示如下:


5.4自定义不完整定义的回调


1个onNextAction

Action1<String> onNextAction = new Action1<String>() {//Action1带有一个参数
    // onNext()
    @Override
    public void call(String s) {
        Log.d("x", s);
    }
};

String[] names = {"gu", "xu", "min"};
Observable observable = Observable.from(names);
observable.subscribe(onNextAction);//onNextAction,onComplete可以看做包装类,onComplete不可单独使用
输出 gu,xu,min

3个均有:

        Action0 onComplete = new Action0() {//Action0没有参数
            @Override
            public void call() {
                Log.d("y", "OK!");
            }
        };

        Action1<String> onNextAction = new Action1<String>() {//Action1带有一个参数
            // onNext()
            @Override
            public void call(String s) {
                Log.d("x", s);
            }
        };

        Action1<Throwable> onError = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                Log.d("x", throwable.toString());
            }//Action1带有一个参数


        };
//        Observable observable;
        String[] names = {"gu", "xu", "min"};
        Observable observable = Observable.from(names);
        observable.subscribe(onNextAction,onError,onComplete);//onNextAction,onComplete可以看做包装类,onComplete不可单独使用

    }
输出结果:

 D/x: gu
D/x: xu
 D/x: min
D/y: OK!

6、同步观察者模式(同一个线程)例子

final int drawableRes = R.mipmap.ic_launcher;
final ImageView imageView = (ImageView) findViewById(R.id.imageView);
Observable.create(new Observable.OnSubscribe<Drawable>() {
    @Override
    public void call(Subscriber<? super Drawable> subscriber) {
        Drawable drawable = getTheme().getDrawable(drawableRes);//触发的事件
        subscriber.onNext(drawable);
        subscriber.onCompleted();
    }
})//创建一个被观察者对象
        .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(MainActivity.this, "Error!", Toast.LENGTH_SHORT).show();
            }
        });
上面例子实现在布局文件的ImageView控件上显示一张图片,事件的发出(call)和消费(onNext,onComplete...)在同一个线程中(Rxjava中的默认情况)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值