AboutRxJavaRxJava是ReactiveX推出的用于JavaVM环境的异步操作库。除了Java环境,ReactiveX还推出了其他编程语言的Rx库,如Py、Js、Go等。网上有很多关于RxJava的介绍和使用,Android开发中也有很多项目使用RxJava。那为什么要用RxJava呢?Android开发也提供了异步操作的方法供开发者使用。我觉得RxJava应该比Handle和AsyncTask更加简洁优雅。1、RxJava采用链式调用,程序逻辑清晰简洁。2、采用扩展观察器设计模式。观察者模式等RxJava的介绍不再赘述。下面的内容主要集中在RxJava和RxAndroid的使用上。RxJava官方文档已经有详细介绍。这部分主要是为了学习和讨论。如有错误,希望大家指出。ObservableObservable使用RxJava创建一个Observable,用于发射数据。下面的Observable的create方法需要传入一个OnSubscribe,它继承自Action1>,Action中的Subscriber就是订阅者。publicstaticObservablecreate(OnSubscribef){returnnewObservable(RxJavaHooks.onCreate(f));}另外,create方法需要实现接口调用,返回订阅者对象。call方法实现了在订阅可观察对象后要执行的事件流。subscriber.onNext发射数据,subscriber.onCompleted可以表示发射事件结束。然后调用observable的subscribe方法实现被订阅后执行的事件流。Observableobservable=Observable.create(newObservable.OnSubscribe(){@Overridepublicvoidcall(Subscribersubscriber){subscriber.onNext("1");subscriber.onNext("2");订阅者.onNext("3");subscriber.onNext("4");subscriber.onNext("5");}});Subscribersubscriber=newSubscriber(){@OverridepublicvoidonCompleted(){}@OverridepublicvoidonError(Throwablee){}@OverridepublicvoidonNext(Strings){System.out.print(s+'\n');}};observable.subscribe(subscriber);//输出结果打印://1//2//3//4//5除了使用create方法创建Observable外,还可以使用from或just来快速设置发出的事件流,简化了create的步骤。Observableo=Observable.from("a","b","c");Observableo=Observable.just("oneobject");RxJava线程的异步操作由SchedulersControl进行调度,通过它来控制执行特定操作的线程。Schedulers.immediate()在当前线程中执行Schedulers.newThread()为每个任务开辟一个线程执行Schedulers.computation()计算任务运行线程Schedulers.io()IO任务运行线程....AndroidSchedulers.mainThread()Android主线程运行的线程控制主要由两个方法控制:subscribeOn()和observeOn():subscribeOn控制Observable.OnSubscribe所在的线程,相当于Observable创建的线程,just,from都是位于。observeOn控制的是Subscriber的线程,也可以说是控制事件执行的线程。Observable.just(1,2,3).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){}@OverridepublicvoidonError(Throwablee){}@OverridepublicvoidonNext(Integerinteger){System.out.print(integer+'\n');}});//输出结果打印://1//2//3记下上面的RxJava链调用代码,Do是不是感觉比之前用的异步调用爽多了?对于处女座来说,非常治愈!OperatorsReactiveX提供了很多的operators,每个都有不同的功能,但是目的是在Observable和Subscribe之间进行交互,修改发出的事件流。本节介绍几个常用且简单的运算符,以后有机会再写一节运算符来详细解释各个运算符的作用。附上算子官方文档,看看有多少。Map()publicfinalObservablemap(Func1func){returncreate(newOnSubscribeMap(this,func));}首先引入一个算子map,map实现Func1接口将T型数据转换为R型数据并返回R型数据。比如传入一个Integer类型的事件队列,map处理后返回String类型。Observable.just(1,2,3).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).map(newFunc1(){@OverridepublicStringcall(Integerinteger){returninteger+"";}}).subscribe(newSubscriber(){...@OverridepublicvoidonNext(Stringstr){System.out.print(str+'\n');}});//输出结果打印://1//2//3Filter()publicfinalObservablefilter(Func1predicate){returncreate(newOnSubscribeFilter(this,predicate));}filter像map一样实现了Func1接口但是它transforms后面的类型是布尔值,过滤发出的事件流。当转换后的布尔值为真时,订阅者可以接收到通过过滤器的事件,否则事件不会被消费。比如事件流过滤要求int值能被2整除才能继续下发,所以订阅者最终能消费的事件是2、4、6、8、10。Observable.just(1,2,3,4,5,6,7,8,9,10).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).filter(newFunc1(){@OverridepublicBooleancall(Integerinteger){returninteger%2==0;}}).map(newFunc1(){@OverridepublicStringcall(Integerinteger){returninteger+"";}}).subscribe(newSubscriber(){......@OverridepublicvoidonNext(Stringstr){System.out.print(str+'\n');Log.i("subscribe",str);}});//输出结果打印://2//3//4//6//8//10Skip()publicfinalObservableskip(intcount){returnlift(newOperatorSkip(count));}skipoperator表示跳过前几个事件从某个事件开始发出事件,索引从0开始。Observable.just(1,2,3,4,5,6,7,8,9,10).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).skip(3).map(newFunc1(){@OverridepublicStringcall(Integerinteger){returninteger+"";}}).subscribe(newSubscriber(){...@OverridepublicvoidonNext(Strings){System.out.print(s+'\n');Log.i("subscribe",s);}});//输出结果打印://4//5//6//7//8//9//10Range()publicstaticObservablerange(intstart,intcount){if(count<0){thrownewIllegalArgumentException("Countcannotbenegative");}if(count==0){returnObservable.empty();}if(start>Integer.MAX_VALUE-count+1){thrownewIllegalArgumentException("start+countcannotexceedInteger.MAX_VALUE");}if(count==1){returnObservable.just(start);}returnObservable.create(newOnSubscribeRange(start,start+(count-1)));}rangeoperator可以理解为,from传递一个连续的int类型数组来发射,n是起始int值,m是Count。例如,n=1,m=5int数组是{1,2,3,4,5}。在这一节的最后,我先学会了这个,算是对RxJava的一个初步的了解和学习。其实RxJava的使用主要还是靠算子的使用。上面介绍的运算符是最简单最基本的,还有很多特别好用的运算符没有介绍。后面我们会继续介绍一些操作符。RxJava由于其强大的功能而在Android开发中非常流行。同时,RxJava可以结合Retrofit使用,更高效地处理网络请求返回值。另外,GitHubGoogleSample上的android-architecture也有一个使用RxJava框架的TODO项目。可以在项目中看到并了解RxJava的实际应用。