首先,在工程的build.gradle文件中dependencies节点直接把RxJava的依赖写上:
dependencies {
....
//编译RxJava所需依赖
compile 'io.reactivex:rxjava:1.0.14'
//编译RxAndroid所需依赖
compile 'io.reactivex:rxandroid:1.0.1'
....
}
接下来就可以做事情了。(不想听我瞎逼逼的直接下载源码吧:http://download.csdn.net/detail/qq_27062249/9700672)
废话不多说,直接上核心代码:
private void getLocalVideo(ILocalVideoProvider localVedioProcider) {
Observable.just(localVedioProcider).map(new Func1<ILocalVideoProvider, List<LocalVedio>>() {
@Override
public List<LocalVedio> call(ILocalVideoProvider iLocalVideoProvider) {
return iLocalVideoProvider.getList();
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<List<LocalVedio>>() {
@Override
public void call(List<LocalVedio> localVedios) {
StringBuffer buffer = new StringBuffer();
for (LocalVedio p :
localVedios) {
buffer.append(p.toString() + "\n");
}
text.setText(buffer.toString());
}
});
}
看到核心代码,有人是不是就蒙逼了!所谓的核心代码就这么点??逗我玩吧。
上面的代码中,使用到了RxJava中的操作符、线程调度、事件的订阅等。
操作符:
just:该方法接受一个泛型返回一个Observable对象,上面的代码中传入了一个ILocalVideoProvider(我们指定获取本地视频文件的接口)
map:该操作符可以将你在just中传入的对象转换成你想要的类型,上面的代码中返回了一个集合List<LocalVedio>(本地视频文件的一个集合,LocalVedio是一个Modle)
线程调度:线程调度主要就subscribeOn方法和observeOn方法指定耗时操作和跟新UI操作所在线程。
subscribeOn:该方法中传入了Schedulers.io(),开启一条新线程去执行耗时操作:iLocalVideoProvider.getList()操作,也就是我们真正获取本地视频的操作。
observeOn:该方法中传入了一个AndroidSchedulers.mainThread(),这是RxAndroid中一个专门为UI线程搞得线程调度器。(RxAndroid就是封装的RxJava,一样的)指定了观察者在接受到被观察者的通知后的行为发生在UI线程,上面代码中用一个TextView去显示查询到的结果。
事件的订阅:
subscribe:在subscribe的方法中难道不是该传一个Observer进来?进到源码才发现subscribe有很多的重载方法。Observer是一个接口,有三个方法,分别是:
void onCompleted();
void onError(Throwable e);
void onNext(T t);
但是在这个例子中,我们并不关心此次事件的完成和出错的情况。我们只是关心被观察者在通知观察者时给它传递了什么东西,也就是onNext(T t)中的t
所以我们就用了其他的重载方法,当然也可以传进去一个Observer,三个方法都关心。(具体还有那些重载的方法可以用,可以进到源码看看)