Android的观察者/被观察者模式作的很好,是一对多模式的典型。当一处的数据发生变化,另一处须要做出相应的改变的时候就能够使用这种模式。 下面的demo的功能是:在MainActivity注册观察者,而后被观察者订阅观察者,而后再SecondActivity中通知观察者数据发生改变,在MainActivity中的观察者做出反应。 代码: 一、观察者ide
/**this
Created by zhuzhiqiang on 2016/7/1.code
观察者类 */ public abstract class DataObserver implements Observer {server
@Override public void update(Observable observable, Object data) { } } 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 二、被观察者队列
/**事件
Created by zhuzhiqiang on 2016/7/1.get
封装的被观察者 */ public class DataObservable extends Observable {it
private static DataObservable instance = null;ast
public static DataObservable getInstance() { if (null == instance) { instance = new DataObservable(); } return instance; }class
public void notifyDataChange(Data data) { //通知订阅者 setChanged(); notifyObservers(data); }
} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 三、MainActivity
public class MainActivity extends BaseActivity {
private DataObserver watcher = null; private Button btn_start = null; private TextView tv_new = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); watcher = new DataObserver() { @Override public void update(Observable observable, Object data) { super.update(observable, data); //观察者接受到被观察者的通知,来更新本身的数据操做。 tv_new.setText("接受到了SecondActivity发送雇来的消息"); } }; initView(); initEvent(); } protected void initEvent() { if (btn_start == null) { showToast("btn_start == null"); } btn_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(context, SecondActivity.class)); } }); } protected void initData() { } protected void initView() { showToast("intiView被执行了"); btn_start = (Button) getView(R.id.button); tv_new = (TextView) getView(R.id.textView); } @Override protected void onResume() { super.onResume(); //观察者往被观察者中添加订阅事件。 DataObservable.getInstance().addObserver(watcher); } @Override protected void onPause() { super.onPause(); //观察者从被观察者队列中移除 DataObservable.getInstance().addObserver(watcher); }
} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 四、SecondActivity
public class SecondActivity extends BaseActivity {
private Button btn_send = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); initEvent(); } @Override protected void initView() { btn_send = (Button) getView(R.id.btn_send); } @Override protected void initEvent() { btn_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Data data = new Data(1); //通知观察者 DataObservable.getInstance().notifyDataChange(data); } }); } @Override protected void initData() { }
} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 五、BaseActivity
public abstract class BaseActivity extends Activity {
protected Context context = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = this; } protected abstract void initView(); protected abstract void initData(); protected void initEvent() { } protected View getView(int id) { return findViewById(id); } protected void showToast(String content) { Toast.makeText(context, content, Toast.LENGTH_SHORT).show(); }
}