观察者模式是我们在开发中经常会用到的一种模式,这种模式的好处在于
我写了一个简单的列子
Application
package com.baobao.observer;
import java.util.HashMap;
import java.util.Map;
import com.baobao.listener.ObserverModeListener;
import android.app.Application;
import android.os.Bundle;
public class AppApplication extends Application {
private static AppApplication app;
public static final int UPDATE_VIEW = 1001;
@Override
public void onCreate() {
super.onCreate();
app = AppApplication.this;
}
public static AppApplication getInstance() {
return app;
}
// 实现整个app观察者模式 同一个action可以注册多个监听
private Map<Integer, ObserverModeListener> observerListener = new HashMap<Integer, ObserverModeListener>();
/**
* 注册监听,不需要的时候要取消监听,可在ondestory()中取消
* @param action
* @param listener
*/
public void registerObserver(int action, ObserverModeListener listener) {
if (listener != null) {
observerListener.put(action, listener);
}
}
public void unRegisterObserver(int action) {
if (observerListener.containsKey(action)) {
observerListener.remove(action);
}
}
/**
* 通知已经注册此action的监听去执行 ,action 必传,其他可传(null)
* @param action 需要传递的action要与注册的一样,
* @param bundle 封装对象,
* @param object 也可以传递自己封装的对象,
*/
public void updateObserver(int action, Bundle bundle, Object object) {
if (observerListener.containsKey(action) && observerListener.get(action) != null) {
observerListener.get(action).toUpate(bundle, object);
}
}
}
全局的观察者监听接口ObserverModeListener
package com.baobao.listener;
import android.os.Bundle;
/**
*
* @Todo 全局的观察者监听,注册在application中,不用的时候一定要解除注册
* @author baobao
*/
public interface ObserverModeListener {
public void toUpate(Bundle bundle, Object object);
}
主界面MainActivity
package com.baobao.observer;
import com.baobao.listener.ObserverModeListener;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView name_tv;
private TextView age_tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
AppApplication.getInstance().registerObserver(
AppApplication.UPDATE_VIEW, new ObserverModeListener() {
@Override
public void toUpate(Bundle bundle, Object object) {
name_tv.setText("李老四");
age_tv.setText("1000岁了,神奇吗?");
}
});
}
private void findView() {
name_tv = (TextView) findViewById(R.id.name_tv);
age_tv = (TextView) findViewById(R.id.age_tv);
findViewById(R.id.confirm_btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,TestActivity.class));
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
//todo 记得销毁
AppApplication.getInstance().unRegisterObserver(AppApplication.UPDATE_VIEW);
}
}
activity B
package com.baobao.observer;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class TestActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AppApplication.getInstance().updateObserver(AppApplication.UPDATE_VIEW, null, null);
finish();
}
});
}
}
从上面这个简单的代码就可以看出一个实现的逻辑,在我们需要有更新操作界面A activity里面 注册监听,在B去做更新监听的操作,其实就是发起一个通知,去提醒对应的action 执行方法。和发广播的原理类似,达到一个通知的效果。