深入理解RxJava编程思想( 四 )

() {@Overridepublic void accept(RegisterResponse registerResponse) throws Exception {// 更新注册UI}});// 3.请求服务器登录操作// 4.登录完成之后,更新登录UIMyRetrofit.createRetrofit().create(IRequestNetwork.class).loginAction(new LoginRequest()).compose(DownloadActivity.rxud()).subscribe(new Consumer() {@Overridepublic void accept(LoginResponse loginResponse) throws Exception {// 更新登录UI}});}
我们用来实现(一行代码)
【深入理解RxJava编程思想】/*** todo方式二 doOnNext* @param view*/@SuppressLint("CheckResult")public void request2(View view) {MyRetrofit.createRetrofit().create(IRequestNetwork.class)// todo 1.请求服务器注册操作.registerAction(new RegisterRequest()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).doOnNext(new Consumer() {@Overridepublic void accept(RegisterResponse registerResponse) throws Exception {// todo 2.注册完成后,更新注册UI}})// todo 3.请求登录服务器操作.observeOn(Schedulers.io()).flatMap(new Function>() {@Overridepublic ObservableSource apply(RegisterResponse registerResponse) throws Exception {return MyRetrofit.createRetrofit().create(IRequestNetwork.class).loginAction(new LoginRequest());}}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() {@Overridepublic void onSubscribe(Disposable d) {progressDialog = new ProgressDialog(RequestActivity.this);progressDialog.show();disposable = d;}@Overridepublic void onNext(LoginResponse loginResponse) {// todo 4.登录完成后,更新登录UI//}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {//todo 5.杀青了if (progressDialog != null) {progressDialog.dismiss();}}});}
为什么使用呢?因为返回的是对象,使得我们的链条没有被打断,我们可以继续向下流动,直到终点,如果我们刚开始使用,我们的链条就被打断了 。
模式与原理 标准观察者与观察者 标准观察者设计模式
首先举一个生活中常见的例子:当今时代,几乎我们人人都会玩微信,而在微信里面,会有一个微信公众号可供我们订阅,当我们订阅了某一个微信公众号后,我们会不定期收到该公共号的推送消息 。
在这个微信公众号服务中,我们用户充当了观察者的角色,而公众号充当了被观察者的角色,当被观察者发生改变时,观察者会立即收到被观察者的改变,一个被观察者可以同时拥有多个观察者,他们之间时一对多的关系 。
我们用代码来实现这个例子:
首先抽象一个被观察者和观察者
// todo 抽象层 被观察者public interface Observable {//关注void addObserver(Observer observer);//取消关注void removeObserver(Observer observer);//被观察者发出改变void notifyObservers();//微信公众号的服务编辑部门发布一条消息void pushMessage(String message);}
// todo 抽象层 观察者public interface Observer {void update(Object o);}
实现被观察者(这里我们就指微信公众号)
// 被观察者 实现public class WechatServerObservable implements Observable {private List observers = new ArrayList<>();private final static String TAG = MainActivity.class.getSimpleName();private String message;@Overridepublic void addObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {//遍历容器for (Observer observer : observers) {observer.update(message);}}@Overridepublic void pushMessage(String message) {this.message = message;Log.d(TAG, "微信服务号更新了消息: " + message);notifyObservers();}}