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

}

相關文章
相關標籤/搜索