1.点击事件的观察者模式:
2.通用观察者模式:
3.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(); } }); }
从整体结构看一下,会发现整个代码结构是从上到下,一条链条式的调用,没有嵌套,这个在逻辑的简洁性上有非常大的优势。并且如果需求越复杂,这种优势越明显。