Android学习之如何同时更新不同界面的UI

来源:互联网 发布:windows loader2.2.1 编辑:程序博客网 时间:2024/05/20 16:34

最近在做音乐播放器这个小项目,在同时更新不同activity的UI上遇到了困难,在网上查资料无果,是后面一个大神给我提供的思路。使用设计模式中的观察者模式。

什么是观察者模式
观察者模式,属于行为模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化的时候,会通知所有的观察者对象,使他们能够自己自动更新。

这里写图片描述

  • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里面,每个主题都可以由任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
  • ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变的时候,给所有注册过的观察者发送通知
  • Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更变通知时更新自己
  • ConcreteObserver:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更变通知时更新自己的状态
    (看了定义,你看懂了嘛,反正我第一次看是懵逼,懵逼,懵逼,这是什么鬼

具体实现:

//第一个activitypublic class MainActivity extends AppCompatActivity implements Controller, View.OnClickListener{    TextView textView ;    Button button;    Button to ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView = (TextView)findViewById(R.id.main1);        button = (Button)findViewById(R.id.change);        button.setOnClickListener(this);        to =(Button)findViewById(R.id.tomain2);        to.setOnClickListener(this);        resigter(this);    }    @Override    public void change() {        textView.setText("main 1 change");        ifChange = true;    }    @Override    public void onClick(View v) {      switch (v.getId()){          case R.id.change:              for (int i = 0;i<controllerList.size();i++){                  controllerList.get(i).change();              }              break;          case R.id.tomain2:              Intent intent = new Intent(this,Main2Activity.class);              startActivity(intent);              break;      }    }}//第二个activitypublic class Main2Activity extends AppCompatActivity implements Controller,View.OnClickListener{        TextView textView;    Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        textView = (TextView)findViewById(R.id.main2);        button = (Button)findViewById(R.id.tomain3);        button.setOnClickListener(this);        resigter(this);        if(ifChange){            change();        }    }    @Override    public void change() {        textView.setText("main 2 change");    }    @Override    public void onClick(View v) {        Intent intent = new Intent(this,Main3Activity.class);        startActivity(intent);    }}//第三个activitypublic class Main3Activity extends AppCompatActivity implements Controller{    TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main3);        textView = (TextView)findViewById(R.id.main3);        resigter(this);      if(ifChange){          change();      }    }    @Override    public void change() {        textView.setText("main 3 change");    }}

这些都是观察者,但是第一个有点不同,它既是观察者,又是发出通知的那个。

public class Content {    public static List<Controller> controllerList = new ArrayList<>();    public static  void resigter(Controller controller){        controllerList.add(controller);        if(MainActivity.class.isInstance(controller)){            Controller content=controllerList.get(0);            controllerList.set(0,controller);            controllerList.set((controllerList.size()-1),content);        }    }    public  static  void unresigter(Controller controller){        if(controllerList.contains(controller))            controllerList.remove(controller);    }    public  static  void removeAll(){        controllerList.clear();    }    public static boolean ifChange = false;}

这是Subject,这里面存放了集合和一些借口

public interface Controller {    void change();}

这是我的Observr,所有观察者的接口,定义了一个change方法。

当我的第一个activity发生改变的时候,我让集合中的所有观察者都发生改变,由于例子的不恰当,当我从第一个去第二个的时候,是新建的activity,虽然注册了,但是并没有响应之前的动作,所以我设立了一个flg->ifChange,用它来标志通知,通知所有的观察者快去改变。

效果:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述


有什么不对的,请大家指点,我也刚开始,可能想得也不对。

原创粉丝点击