Android学习之如何同时更新不同界面的UI
2017-07-21 15:44
447 查看
最近在做音乐播放器这个小项目,在同时更新不同activity的UI上遇到了困难,在网上查资料无果,是后面一个大神给我提供的思路。使用设计模式中的观察者模式。
什么是观察者模式
观察者模式,属于行为模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化的时候,会通知所有的观察者对象,使他们能够自己自动更新。
Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里面,每个主题都可以由任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变的时候,给所有注册过的观察者发送通知
Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更变通知时更新自己
ConcreteObserver:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更变通知时更新自己的状态
(看了定义,你看懂了嘛,反正我第一次看是懵逼,懵逼,懵逼,这是什么鬼
具体实现:
这些都是观察者,但是第一个有点不同,它既是观察者,又是发出通知的那个。
这是Subject,这里面存放了集合和一些借口
这是我的Observr,所有观察者的接口,定义了一个change方法。
当我的第一个activity发生改变的时候,我让集合中的所有观察者都发生改变,由于例子的不恰当,当我从第一个去第二个的时候,是新建的activity,虽然注册了,但是并没有响应之前的动作,所以我设立了一个flg->ifChange,用它来标志通知,通知所有的观察者快去改变。
效果:
有什么不对的,请大家指点,我也刚开始,可能想得也不对。
什么是观察者模式
观察者模式,属于行为模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化的时候,会通知所有的观察者对象,使他们能够自己自动更新。
Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里面,每个主题都可以由任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变的时候,给所有注册过的观察者发送通知
Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更变通知时更新自己
ConcreteObserver:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更变通知时更新自己的状态
(看了定义,你看懂了嘛,反正我第一次看是懵逼,懵逼,懵逼,这是什么鬼
具体实现:
//第一个activity public 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; } } } //第二个activity public 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); } } //第三个activity public 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,用它来标志通知,通知所有的观察者快去改变。
效果:
有什么不对的,请大家指点,我也刚开始,可能想得也不对。
相关文章推荐
- 如何利用Handler更新android的UI
- Android service broadcast 动态 更新 UI 界面
- android学习之通过handler更新UI的例子
- Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI)
- Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI)
- Android Service 通知Activity更新界面的方法研究|Service通过Broadcast更新UI
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- Android之Handler,举例说明如何更新UI
- Android菜鸟学习笔记之---用handler更新UI
- WPF中UI及时更新,如何在处理长时间工作时,保持界面的持续更新
- Android如何同时安装相同应用程序不同版本
- 如何利用Handler更新android的UI
- 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能
- android 滑动引导界面,UI 学习之路一
- Android Service 通知Activity更新界面的方法研究|Service通过Broadcast更新UI
- 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能
- <为知更新>Android系统如何实现UI的自适应
- android handler实现界面UI的更新
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- WPF中UI及时更新,如何在处理长时间工作时,保持界面的持续更新