Android开发Android开发Android开发经验谈

Rxjava解析笔记 | Rxjava概述 & 传统观察

2019-06-02  本文已影响5人  凌川江雪

进行耗时任务

比如:在后台做一些网络操作、查询或者一些复杂计算的时候,
我们如果不用其他框架的话,
最常见做法即自己开一个子线程
然后通过回调的形式获取到结果(如后台以结果为参数发送广播,前台回调onReceive()接收获取到结果);

但是这样有一个问题,
随着业务逻辑越来越复杂,
项目会陷入回调中套回调的病区
这对后期维护代码来说是一个很严重的问题;


而Rxjava的出现解决了以上的问题


关于Rxjava的设计模式——观察者模式

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新;

简单看一下Observer的代码

package com.example.jiajiemu.a11.observe;



/**
 * Created by Mjj on 2017/10/6.
 */

public interface Observerable {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}
package com.example.jiajiemu.a11.observe;

/**
 * Created by Mjj on 2017/10/6.
 */

public interface Observer {
    public void update(int edition,float cost);
}
package com.example.jiajiemu.a11.observe;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Mjj on 2017/10/6.
 */

public class ConcreteObserverable implements Observerable {

    private List<Observer> mObservers;
    private int edition;
    private float cost;

    public ConcreteObserverable() {
        mObservers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        mObservers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        int i = mObservers.indexOf(o);
        if(i >= 0)
            mObservers.remove(i);
    }

    @Override
    public void notifyObservers() {
        for(int i = 0; i < mObservers.size(); i++){
            Observer observer = mObservers.get(i);
            observer.update(edition, cost);
        }
    }

    public void setInfomation(int edition,float cost){
        this.edition = edition;
        this.cost = cost;
        //信息更新完毕,通知所有观察者
        notifyObservers();
    }

}
    @Override
    public void notifyObservers() {
        for(int i = 0; i < mObservers.size(); i++){
            Observer observer = mObservers.get(i);
            observer.update(edition, cost);
        }
    }
package com.example.jiajiemu.a11.observe;

/**
 * Created by Mjj on 2017/10/6.
 */

public class ConcreateObserver implements Observer {

    private String name;
    private int edition;
    private float cost;

    public ConcreateObserver(String name){
        this.name = name;
    }

    @Override
    public void update(int edition, float cost) {
        this.edition = edition;
        this.cost = cost;
        buy();
    }

    public void buy(){
        System.out.println(name+"购买了第"+edition+"期的杂志,花费了"+cost+"元。");
    }

}
package com.example.jiajiemu.a11.observe;

/**
 * Created by Mjj on 2017/10/6.
 */

public class Client {
    public static void main(String[] args) {
        //创建被观察者
        ConcreteObserverable concreteObserverable = new ConcreteObserverable();

        //创建三个不同的观察者
        Observer observerA = new ConcreateObserver("A");
        Observer observerB = new ConcreateObserver("B");
        Observer observerC = new ConcreateObserver("C");

        //将观察者注册到被观察者中
        concreteObserverable.registerObserver(observerA);
        concreteObserverable.registerObserver(observerB);
        concreteObserverable.registerObserver(observerC);

        //更新被观察者中的数据,当数据更新后,会自动通知所有已注册的观察者
        concreteObserverable.setInfomation(5, 12);
    }

}
@Override
    public void notifyObservers() {
        for(int i = 0; i < mObservers.size(); i++){
            Observer observer = mObservers.get(i);
            observer.update(edition, cost);
        }
    }

    public void setInfomation(int edition,float cost){
        this.edition = edition;
        this.cost = cost;
        //信息更新完毕,通知所有观察者
        notifyObservers();
    }

传统观察者模式的使用场景

1.一个方面的操作/处理依赖于另一个方面的状态变化
(即观察者的操作依赖于被观察者的状态变化;
埋伏中的警察的操作依赖于小偷的状态变化,
球迷的操作依赖于球赛的状态变化)

  1. 如果在更改一个对象的时候,
    需要同时连带改变其他的对象;

  2. 当一个对象必须通知其他的对象,
    但是你又希望这个对象和其他被通知的对象是松散耦合的;





参考自 慕课网

上一篇下一篇

猜你喜欢

热点阅读