【android 观察者与被观察者】

观察者

	观察者的作用主要是用于 观察 被观察者 ,被观察者改变数据通知 观察者 那么观察者  数值改变

被观察者

		被观察者 数据源    被观察者数据改变 通知观察者  

观察者模式的主要作用

	主要是用于 传递数据  比如  rxjava  Eventbug  有用到观察者的 地方  比如  服务器请求数据之后  数据 根据  observiced  发送到 observice  由 被观察者传递给 观察者 数据返回到 ui
小编 写这个主要是因为 在继承百度地图的时候  有这样一个问题  继承百度 地图定位功能的时候  需要写一个 public class MyLocationListener extends BDAbstractLocationListener {}   这样一个 内部类  但是非静态内部类的话  容易造成 内存问题  所以 我把他们分开写了   这样就会导致传递数据 会很麻烦 后开我觉得  观察者 模式 跟 被观察者  用于 ui 跟 class  很方便  或者 classclass 之间 但是 使用rxjava  或者eventbus  三方框架 有些麻烦 毕竟目前 就这一个地方 用到了  所以 自己 就干脆 写了个简单的  被观察者  代码如下

##首先 写好 被观察者 跟 观察者的 接口 了解一下 自己 需要通知 接口的 数据是什么

public interface MyObserved {  //被观察者 接口
    void addobservice(MyObserviceVo addobservice); //添加 观察者

    void removeobservice(MyObserviceVo removeobservice); //移除观察者

    void noticeobservice(Pserson noticeobservice); // 通知 观察者 我要改变什么数据 类型
}
public interface MyObservice { //观察者 接口
    void upData(Pserson data); // 观察者接口  我接受什么类型数据
}

##接口完成之后 开始写 类

public class MyObservicedVo implements MyObserved { //被观察者 实现 被观察者接口

    public ArrayList<MyObserviceVo> list = new ArrayList<>();

    @Override
    public void addobservice(MyObserviceVo addobservice) {
        list.add(addobservice); //添加 观察者 因为观察者 观察被观察者
    }

    @Override
    public void removeobservice(MyObserviceVo removeobservice) {
        if (list.size() > 0) {  //移除并且 置空
            list.remove((removeobservice));
            list = null;
        } 

    }

    @Override
    public void noticeobservice(Pserson pserson) {
        if (list.size() > 0) {  //通知 所有观察者 改变的 数据
            for (MyObservice nitice : list) {
                nitice.upData(pserson);
            }
        }
    }
}
public class MyObserviceVo implements MyObservice { //观察者 实现接口


    @Override
    public void upData(Pserson data) {
        System.out.print("观察者接受 消息 :" + data.getName()+"     \n");
    }
}

通知的数据类型


public class Pserson {
    public String name;

    public Pserson() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

##最后 测试类 测试 被观察者数据改变 能否通知到 观察者

public class Test {

    public static void main(String[] args) {


        MyObservicedVo myObservicedVo = new MyObservicedVo(); //创建被观察者
        myObservicedVo.addobservice(new MyObserviceVo()); //添加观察者

        Pserson pserson = new Pserson();//创建 通知数据

        new Thread(new Runnable() { //创建线程 循环   每隔两秒 通知观察者 通知数据类型改变 直到 a值>10 停止通知  
            int a = 1;

            @Override
            public void run() {

                while (a <= 10) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }

                    pserson.setName("我的名字叫--->" + a+"\n");

                    myObservicedVo.noticeobservice(pserson);

                    a++;

                }

                Thread.interrupted();
                System.out.print("    " + "循环完成" + "    ");


            }
        }).start();


    }
}

因为这个是自己写的 简单被观察者 通知观察者 所以在Avtivity stop() 中 移除就行 最后结果

observiced

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值