Android Observer的demo

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

}

相关文章
相关标签/搜索