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(); }
}