观察者模式,Fragment监听Activity状态变化

问题:当LoginActivity登陆后,向MainActivity中的Fragment返回登陆状态,然后加载一些信息。


从问题上看回调可以解决。

回调实现(失败)
在LoginActivity定义一个接口,登陆成功后调用回调方法。
MainActivity实现回调方法,但是在注册回调事件的时候,不知道怎么获取LoginActvity的引用。


  • 注册广播和发送广播 简书
  • 观察者模式 csdn

参考上面这篇观察者模式,顺便学习一下观察者模式,实现BaseObserverFragment,让

public abstract class BaseObserverFragment extends Fragment {

    private FragmentEventObserver fragmentEventObserver;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        fragmentEventObserver=new FragmentEventObserver(this);
        registerObserver(fragmentEventObserver);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        removeObserver(fragmentEventObserver);
    }

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

    protected abstract void onChange(String eventType);

    /**
     * 通过这个方法来告诉具体的观察者需要监听的业务类型
     * @return
     */
    protected abstract String[] getObserverEventType();

    private static class FragmentEventObserver extends EventObserver {
        //添加弱引用,防止对象不能被回收
        private final WeakReference<BaseObserverFragment> mFramgent;

        public FragmentEventObserver(BaseObserverFragment framgnet) {
            super();
            mFramgent =new WeakReference<>(framgnet);
        }

        @Override
        public void onChanged(String eventType) {
            BaseObserverFragment fragment= mFramgent.get();
            if (fragment!=null){
                fragment.onChange(eventType);
            }
        }
    }
}

LoginActivity登陆成功后调用

Notify.getInstance().NotifyActivity(EventType.SHOW_FRIENDS);

这样当登陆时,就能够获得登陆的状态

猜你喜欢

转载自blog.csdn.net/irony0egoist/article/details/72522675