RxJava观察者模式
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();
}});
}
【RxJava观察者模式】从整体结构看一下,会发现整个代码结构是从上到下,一条链条式的调用,没有嵌套,这个在逻辑的简洁性上有非常大的优势。并且如果需求越复杂,这种优势越明显。
推荐阅读
- RxJava|RxJava 在Android项目中的使用(一)
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”
- 洗洗睡了|洗洗睡了 | 休息的时候,千万注意切换你的行为模式