我们在开发过程中经常会遇到这种情况:当某个条件发生改变的时候,有多个页面需要去执行刷新操作。我以前遇到过这样一个需求:当用户选择的日期发生改变的时候,页面A、B、C都需要重新请求数据来刷新页面,并且,在A、B、C这三个页面用户都可以去切换日期。
刚拿到这个需求的时候,第一想法是通过各个页面的onActivityResult()方法来控制各个页面的刷新,但是这样的做法在实现起来比较烦,各种去写requestCode和onActivityResult()方法,而且各页面整体的逻辑差不多,会产生很多重复代码,并且如果有需求写一个D页面,日期切换D页面也同步刷新,那么又要重构一下逻辑了。。。。如图1(图比较low)
显而易见,这并不是一个好的方法。下面进入正题:
先定义一个时间改变的回调接口:
public interface TimeChangeCallBack {
void timeChange(String time);
}
然后定义一个单例类,类中维护一个TimeChangeCallBack 类的数组:
public class TimeChangeSingleton {
public static TimeChangeSingleton Instance = new TimeChangeSingleton();
private List<TimeChangeCallBack> mCallBacks = new ArrayList<>();
private TimeChangeSingleton() {
}
public void addCallBack(TimeChangeCallBack callBack) {
if (!mCallBacks.contains(callBack)) {
mCallBacks.add(callBack);
}
}
public void excuteCallBack(String time) {
for (TimeChangeCallBack callBack : mCallBacks) {
if (callBack != null) {
callBack.timeChange(time);
}
}
}
public void removeCallBack(TimeChangeCallBack callBack) {
if (mCallBacks.contains(callBack)) {
mCallBacks.remove(callBack);
}
}
}
下面就是各个页面自己去调用这个类的一些方法,写个demo:
public class DemoActivity extends Activity {
private TimeChangeCallBack mCallBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCallBack = new TimeChangeCallBack() {
@Override
public void timeChange(String time) {
// TODO:
}
};
TimeChangeSingleton.Instance.addCallBack(mCallBack);
}
@Override
protected void onDestroy() {
TimeChangeSingleton.Instance.removeCallBack(mCallBack);
super.onDestroy();
}
}
这里一定要记得在页面销毁的时候去调用TimeChangeSingleton.Instance.removeCallBack(mCallBack)方法,否则会导致内存泄漏。
现在有3个页面A、B、C,A跳到B,B跳到C,C页面切换日期,A B C三个页面刷新,那么我们在三个activity的oncreate方法中都执行TimeChangeSingleton.Instance.addCallBack(mCallBack),每个页面重写callback中的timeChange方法去执行需要做的操作,并在c页面切换日期的时候去调用TimeChangeSingleton.Instance.excuteCallBack方法,就能轻松的实现三个页面的联动。
图2.png
欢迎批评指正!
网友评论