当前位置: 代码迷 >> 综合 >> andriod observer模式
  详细解决方案

andriod observer模式

热度:92   发布时间:2023-12-18 22:41:46.0
在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。例如在文档/视图结构中,文档被修改了,视图就会得到通知。 

      java.util.Observable中有两个方法对Observer特别重要,一个是setChange()方法用来设置一个内部标志位注明数据发生了变化;一个是notifyObservers()方法会去调用一个列表中所有的Observer的update()方法,通知它们数据发生了变化。 


      Observer通过Observable的addObserver()方法把自己添加到这个列表中。这个列表虽然由Observable拥有,但Observable并不知道到底有哪些Observer正在观察等待通知。Observable只提供一个方法让Observer能把自己添加进列表,并保证会去通知Observer发生了变化。通过这种机制,可以有任意多个Observer对Observable进行观察,而不影响Observable的实现。


一个简单例子(页面切换时 修改 头尾部分)

1.TitleManager.java

package com.example.view.manager;import java.util.Observable;
import java.util.Observer;
import org.apache.commons.lang3.StringUtils;
import com.example.myandriod3.ConstantValue;
import com.example.myandriod3.R;
import com.example.views.SecondUi;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;public class TitleManager implements Observer 
{private RelativeLayout commonContainer;private RelativeLayout loginContainer;private RelativeLayout unLoginContainer;private ImageView goback;//  private ImageView help;//  private ImageView login;//  private TextView titleContent;// private TextView userInfo;///*** 单例模式 */private static TitleManager instance = new TitleManager();private TitleManager() {}public static TitleManager getInstance() {return instance;}/*** 初始化* @param activity*/public void init(Activity activity){commonContainer = (RelativeLayout) activity.findViewById(R.id.ii_common_container);unLoginContainer = (RelativeLayout) activity.findViewById(R.id.ii_unlogin_title);loginContainer = (RelativeLayout) activity.findViewById(R.id.ii_login_title);goback = (ImageView) activity.findViewById(R.id.ii_title_goback);help = (ImageView) activity.findViewById(R.id.ii_title_help);login = (ImageView) activity.findViewById(R.id.ii_title_login);titleContent = (TextView) activity.findViewById(R.id.ii_title_content);userInfo = (TextView) activity.findViewById(R.id.ii_top_user_info);setListener();}private void setListener() {goback.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {System.out.println("goback");}});help.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {System.out.println("help");}});/*** 登陆页面*/login.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//MiddleManager.getInstance().ChangeUi(new SecondUi(MiddleManager.getInstance().getContext()));MiddleManager.getInstance().ChangeUi2(SecondUi.class);//System.out.println("login");}});}public void initTitle(){commonContainer.setVisibility(View.GONE);loginContainer.setVisibility(View.GONE);unLoginContainer.setVisibility(View.GONE);}public void showCommonTitle() {initTitle();commonContainer.setVisibility(View.VISIBLE);}public void showUnLoginTitle() {initTitle();unLoginContainer.setVisibility(View.VISIBLE);}public void showLoginTitle() {initTitle();loginContainer.setVisibility(View.VISIBLE);}public void changeTitle(String title) {titleContent.setText(title);}//观察者模式 中  update 操作 修改 头部操作@Overridepublic void update(Observable observable, Object data){// TODO Auto-generated method stubif (data != null && StringUtils.isNumeric(data.toString())) {int id = Integer.parseInt(data.toString());switch (id) {case ConstantValue.VIEW_FIRST:showUnLoginTitle();break;case ConstantValue.VIEW_SECOND:showCommonTitle();break; }}}}

2.BottomManager.java

package com.example.view.manager;import java.util.Observable;
import java.util.Observer;import org.apache.commons.lang3.StringUtils;import com.example.myandriod3.ConstantValue;
import com.example.myandriod3.R;import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;public class BottomManager implements Observer 
{private static BottomManager instrance;private BottomManager() {}public static BottomManager getInstrance() {if (instrance == null) {instrance = new BottomManager();}return instrance;}protected static final String TAG = "BottomManager";private RelativeLayout bottomMenuContainer;private LinearLayout commonBottom; private LinearLayout playBottom; private ImageButton cleanButton;private ImageButton addButton;private TextView playBottomNotice;private ImageButton homeButton;private ImageButton hallButton;private ImageButton rechargeButton;private ImageButton myselfButton;public void init(Activity activity) {bottomMenuContainer = (RelativeLayout) activity.findViewById(R.id.ii_bottom);commonBottom = (LinearLayout) activity.findViewById(R.id.ii_bottom_common);playBottom = (LinearLayout) activity.findViewById(R.id.ii_bottom_game);playBottomNotice = (TextView) activity.findViewById(R.id.ii_bottom_game_choose_notice);cleanButton = (ImageButton) activity.findViewById(R.id.ii_bottom_game_choose_clean);addButton = (ImageButton) activity.findViewById(R.id.ii_bottom_game_choose_ok);setListener();}private void setListener() {cleanButton.setOnClickListener(new OnClickListener() {public void onClick(View v) {Log.i(TAG, "1");}});addButton.setOnClickListener(new OnClickListener() {public void onClick(View v) {Log.i(TAG, "2");}});}public void showCommonBottom() {if (bottomMenuContainer.getVisibility() == View.GONE || bottomMenuContainer.getVisibility() == View.INVISIBLE) {bottomMenuContainer.setVisibility(View.VISIBLE);}commonBottom.setVisibility(View.VISIBLE);playBottom.setVisibility(View.INVISIBLE);}public void showGameBottom() {if (bottomMenuContainer.getVisibility() == View.GONE || bottomMenuContainer.getVisibility() == View.INVISIBLE) {bottomMenuContainer.setVisibility(View.VISIBLE);}commonBottom.setVisibility(View.INVISIBLE);playBottom.setVisibility(View.VISIBLE);}public void changeBottomVisiblity(int type) {if (bottomMenuContainer.getVisibility() != type)bottomMenuContainer.setVisibility(type);}public void changeGameBottomNotice(String notice) {playBottomNotice.setText(notice);}@Overridepublic void update(Observable observable, Object data){// TODO Auto-generated method stubif (data != null && StringUtils.isNumeric(data.toString())) {int id = Integer.parseInt(data.toString());switch (id) {case ConstantValue.VIEW_FIRST:showCommonBottom();break;case ConstantValue.VIEW_SECOND:showGameBottom();break;}}}}

3.MiddleManager.java 

package com.example.view.manager;import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Observable;import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.RelativeLayout;import com.example.myandriod3.ConstantValue;
import com.example.myandriod3.R;//Observable 成为观察者
public class MiddleManager extends Observable
{private RelativeLayout middle;private BaicUi curridBaicUi;//存放实例化的对象private Map<String, BaicUi> VIEWCACHE = new HashMap<String, BaicUi>();//历史记录public LinkedList<String> HISTORY = new LinkedList<String>();public void setMiddle(RelativeLayout middle) {this.middle = middle;}/*** 单例模式 */private static MiddleManager instance = new MiddleManager();private MiddleManager() {}public static MiddleManager getInstance() {return instance;}/*** 初始化 如果存在 就不存放* @param activity*/public void ChangeUi2(Class<? extends BaicUi> targetClazz){if(curridBaicUi!=null && curridBaicUi.getClass() == targetClazz){return;}BaicUi targetui =null;String key=targetClazz.getSimpleName();if(VIEWCACHE.containsValue(key)){targetui=VIEWCACHE.get(key);}else{try{Constructor<? extends BaicUi> constructor = targetClazz.getConstructor(Context.class);targetui = constructor.newInstance(getContext());VIEWCACHE.put(key, targetui);} catch (Exception e){throw new RuntimeException("constructor new instance error");}}middle.removeAllViews();View child=targetui.getChild();middle.addView(child);child.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.ia_view_change));curridBaicUi = targetui; //System.out.println(key);HISTORY.addFirst(key);changeTitleAndBottom();}public void ChangeUi(BaicUi ui){middle.removeAllViews();View child=ui.getChild();middle.addView(child);child.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.ia_view_change));}private void changeTitleAndBottom() {//		  switch (curridBaicUi.getID()) { 
//		  case ConstantValue.VIEW_FIRST:
//			  TitleManager.getInstance().showUnLoginTitle();
//			  BottomManager.getInstrance().showCommonBottom(); 
//			 break;
//			 case ConstantValue.VIEW_SECOND:
//				 TitleManager.getInstance().showCommonTitle();
//				 BottomManager.getInstrance().showGameBottom(); 
//				 break;
//			 }setChanged();notifyObservers(curridBaicUi.getID());}/***获取上下文* @return*/public Context getContext() {return middle.getContext();}/*** 返回键操作* */public boolean goBack() {if (HISTORY.size() > 0) {// Throws:NoSuchElementException - if this LinkedList is empty.HISTORY.removeFirst();if (HISTORY.size() > 0) {// Throws:NoSuchElementException - if this LinkedList is empty.String key = HISTORY.getFirst();BaicUi targetUI = VIEWCACHE.get(key);middle.removeAllViews();middle.addView(targetUI.getChild());curridBaicUi = targetUI;changeTitleAndBottom();return true;}}return false;}}

4.MainActivity.java

//建立观察者 和被观察者之间的关系MiddleManager.getInstance().addObserver(TitleManager.getInstance());MiddleManager.getInstance().addObserver(BottomManager.getInstrance());


  相关解决方案