从今天开始好好研究一下RxJava,最近好像很流行,好多开源项目都使用到了。RxJava最核心的两个东西是Observable(被观察者,事件源)和Subscriber(观察者)
创建Observable
调用Observable对象的静态create方法
重写call方法
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
//相当于调用了Subscriber对应的方法
subscriber.onNext("hellorxjava");
subscriber.onCompleted();
}
});
创建Subscriber
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
mTextView.setText(s);
}
};
observable.subscribe(subscriber);
调用just函数,参数为传递给onNext函数的值,然后调用subscribe方法,我们可以看到这个方法可以接收三个参数,Action1,Action1,Action0,分别对应onNext,onError,onCompelete.
//只实现onNext
Observable.just("first").subscribe(new Action1<String>() {
@Override
public void call(String s) {
}
});
//全部实现
Observable.just("helloandrid").subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d(TAG, "call: onNext");
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d(TAG, "call: onError");
}
}, new Action0() {
@Override
public void call() {
Log.d(TAG, "call: onComplete");
}
});
关于just操作符这里还要说一点,不管我们是否进行了订阅,just中的函数都会执行,比如下面的例子。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observable.just(add(1,2));
}
public int add(int a,int b){
Toast.makeText(this, "执行了", Toast.LENGTH_SHORT).show();
return a+b;
}
我们并没有进行订阅,但是还是会执行方法。
主要使用map操作符
先看看map方法的定义
接收两个参数,第一个参数的类型是just函数中内容所对应的类型,比如“hello”对应String,数字对应Integer,一旦我们确定了just函数的内容,这个参数的类型就不能变了。
第二个参数的值是最终结果的类型,
用法一
我们要把输入的hello变为hello android
Observable.just("hello").map(new Func1<String, String>() {
@Override
public String call(String s) {
return s+" android";
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
mTextView.setText(s);//s = "hello android"
}
});
//类型变换
Observable.just("adf").map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer result) {
mTextView.setText(result);
}
});