美文网首页Android知识Android技术知识Android开发
Android 多页面联动: 单例加观察者模式

Android 多页面联动: 单例加观察者模式

作者: af274772f108 | 来源:发表于2017-02-13 14:32 被阅读277次

    我们在开发过程中经常会遇到这种情况:当某个条件发生改变的时候,有多个页面需要去执行刷新操作。我以前遇到过这样一个需求:当用户选择的日期发生改变的时候,页面A、B、C都需要重新请求数据来刷新页面,并且,在A、B、C这三个页面用户都可以去切换日期。
    刚拿到这个需求的时候,第一想法是通过各个页面的onActivityResult()方法来控制各个页面的刷新,但是这样的做法在实现起来比较烦,各种去写requestCode和onActivityResult()方法,而且各页面整体的逻辑差不多,会产生很多重复代码,并且如果有需求写一个D页面,日期切换D页面也同步刷新,那么又要重构一下逻辑了。。。。如图1(图比较low)

    图1.png

    显而易见,这并不是一个好的方法。下面进入正题:

    先定义一个时间改变的回调接口:

    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

    欢迎批评指正!

    相关文章

      网友评论

        本文标题:Android 多页面联动: 单例加观察者模式

        本文链接:https://www.haomeiwen.com/subject/vozzittx.html