package com.cheng.bestpractice.observer.base; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.cheng.bestpractice.observer.observer.impl.EventObserver; import com.cheng.bestpractice.observer.observer.impl.EventSubject; import java.lang.ref.WeakReference; /** * 带有观察者模式的Activity,本质上就是观察者 */ public abstract class BaseObserverActivity extends AppCompatActivity { private ActivityEventObserver mActivityEventObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivityEventObserver = new ActivityEventObserver(this); registerObserver(mActivityEventObserver); } @Override protected void onDestroy() { super.onDestroy(); removeObserver(mActivityEventObserver); } public void registerObserver(EventObserver observer) { final String[] observerEventTypes = getObserverEventType();//获取所有需要监听的业务类型 if(observerEventTypes != null && observerEventTypes.length>0){ final EventSubject eventSubject = EventSubject.getInstance(); eventSubject.registerObserver(observer); } } public void removeObserver(EventObserver observer) { final String[] observerEventTypes = getObserverEventType();//获取所有需要监听的业务类型 if(observerEventTypes != null && observerEventTypes.length>0){ final EventSubject eventSubject = EventSubject.getInstance(); eventSubject.removeObserver(observer); } } /** * 该方法会在具体的观察者对象中调用,可以根据事件的类型来更新对应的UI,这个方法在UI线程中被调用, * 所以在该方法中不能进行耗时操作,可以另外开线程 * @param eventType 事件类型 */ protected abstract void onChange(String eventType); /** * 通过这个方法来告诉具体的观察者需要监听的业务类型 * @return */ protected abstract String[] getObserverEventType(); private static class ActivityEventObserver extends EventObserver { //添加弱引用,防止对象不能被回收 private final WeakReference<BaseObserverActivity> mActivity; public ActivityEventObserver(BaseObserverActivity activity){ super(); mActivity = new WeakReference<>(activity); } @Override public void onChange(String eventType) { BaseObserverActivity activity = mActivity.get(); if(activity != null){ activity.onChange(eventType); } } } }