RxJava观察者模式

1.点击事件的观察者模式:
RxJava观察者模式
文章图片


RxJava观察者模式
文章图片
2.通用观察者模式:


RxJava观察者模式
文章图片
3.RxJava的观察者模式
RxJava使用的是扩展的观察者模式:
RxJava观察者模式
文章图片
RxJava观察者模式
文章图片
如图所示,RxJava的基本概念分别为:Observable(被观察者),Observer(观察者),subscribe (订阅)、事件; 不同的是,RxJava 把多个事件看做一个队列,并对每个事件单独处理。
注意:在一个队列中onCompleted() 和 onError(),只有一个会被调用。因为,如果调用了onCompleted()就说明队列执行完毕,没有出现异常,则不会调用onError()方法。相对的,如果队列异常,调用onError()方法的同时会终止队列,队列也就无法完成。


4.举个例子(代码演示)
通过以下代码,来看看RxJava编程和传统命令行编程的区别和优势:
/**
* 假设:1.我们有一个Listview,用于显示显示多张图片
*2.现在给出一个目录数组,把所有目录中的jpg图片都显示到listview中
*3.读取图片是耗时操作,需要在后台运行,listview更新需要在UI线程执行
*
* 常规实现方式:
*/publicvoidupdataImage(finalFile[] routes,finalContext context){newThread() {@Overridepublicvoidrun(){super.run(); for(File route : routes) {File[] files = route.listFiles(); for(File file : files) {if(file.getName().endsWith(".jpg")) {finalBitmap bitmap = getBitmap(file); ((MainActivity) context).runOnUiThread(newRunnable() {@Overridepublicvoidrun(){imageList.add(bitmap); imageListAdatper.notifyDataSetChanged(); }}); }}}}}.start(); }
用RxJava是这样实现的:
publicvoidupdataImage(){Observable.from(routes).flatMap(newFunc1() {@OverridepublicObservablecall(File file){returnObservable.from(file.listFiles()); }}).filter(newFunc1() {@OverridepublicBooleancall(File file){returnfile.getName().endsWith(".jpg"); }}).map(newFunc1() {@OverridepublicBitmapcall(File file){returngetBitmap(file); }}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(newAction1() {@Overridepublicvoidcall(Bitmap bitmap){imageList.add(bitmap); imageListAdatper.notifyDataSetChanged(); }}); }
【RxJava观察者模式】从整体结构看一下,会发现整个代码结构是从上到下,一条链条式的调用,没有嵌套,这个在逻辑的简洁性上有非常大的优势。并且如果需求越复杂,这种优势越明显。

    推荐阅读