美文网首页
Android 封装系统 Observable 实现访 IOS

Android 封装系统 Observable 实现访 IOS

作者: 莱姆船长 | 来源:发表于2020-02-20 18:22 被阅读0次
  • 定义一个 Observable 子类

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;

public class LGFObservable extends Observable {

    /**
     * 通知 model
     */
    public static class model<OV> {
        public String name;// 通知名字
        public OV obj;// 传递的对象
    }

    /**
     * Observer update 回参类型泛型优化转换
     */
    public static abstract class observer implements Observer {
        @Override
        public void update(final Observable observable, final Object o) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    lgf_Update(observable, (model)o);
                }
            });
        }
        abstract public void lgf_Update(Observable observable, model obj);
    }

    /**
     * 堆内所有通知
     */
    private Map<String, ArrayList<observer>> observerMap;

    /**
     * Observable 单列初始化
     */
    private volatile static LGFObservable lgf_Observable = null;
    public static LGFObservable lgf() {
        if (lgf_Observable == null) {
            synchronized (LGFObservable.class) {
                if (lgf_Observable == null) {
                    lgf_Observable = new LGFObservable();
                    lgf_Observable.observerMap = new HashMap<>();
                }
            }
        }
        return lgf_Observable;
    }

    /**
     * Fragment 独立维护一组 Observer
     */
    public <F> void addObserver(F fragment, observer o) {
        ArrayList<observer> observers = observerMap.get(fragment.getClass().getName());
        if (observers == null) { observers = new ArrayList<>(); }
        observers.add(o);
        observerMap.put(String.valueOf(System.identityHashCode(fragment)), observers);
        lgf_Observable.addObserver(o);
    }

    /**
     * 防止 Observer 乱入,每个 Fragment 维护一组 Observer 记得在该 Fragment 销毁前移除所有属于该 Fragment 的 Observer
     */
    public <F> void removeObserver(F fragment) {
        observerMap.remove(String.valueOf(System.identityHashCode(fragment)));
    }

    /**
     * 发送通知 arg 为通知参数用于接收位置的判断
     */
    public void postObserver(String name) {
        postObserver(name, null);
    }
    public <OV> void postObserver(String name, OV obj) {
        lgf_Observable.setChanged();
        model model = new model<OV>();
        model.name = name;
        model.obj = obj;
        lgf_Observable.notifyObservers(model);
    }

}

  • 可以愉快的在未释放内存的各个 Fragment/Activity/View/Class 间通信啦

  • 这里暂用 Fragment 示例

  • 在任意位置的 Fragment 发送通知

// 任意 Fragment
public class LGFTestFragmentOther extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        // 在需要启动传值的地方发送 LGFObservable
        // 这里的 name 就是要通知的名字
        LGFObservable.lgf().postObserver("FaSong888", "我是要传的值:888");

        return inflater.inflate(R.layout.fragment_login, container, false);
    }
}

  • 在需要接收的地方接收通知传值

public class LGFTestFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        // 在需要被传值的 Fragment 中注册 LGFObservable
        LGFObservable.lgf().addObserver(this, new LGFObservable.observer() {
            @Override
            public void lgf_Update(Observable observable, LGFObservable.model obj) {
                if (obj.name.equals("FaSong888")) {// 接收名字必须和发送名字对应才可以取到对应的值
                    // obj 就是 post 过来的数据
                    // obj.obj == "我是要传的值:888"
                    System.out.print(obj.obj);
                } else if ... 
                // 这里可以注册多个名字,只要系统任意位置有地方执行了该 name 的 post 
                // 且该类内存未被释放也就是这里的 LGFObservable.lgf().removeObserver(this); 方法未走
                // 就都可以收到来自各方的通知传值
            }
        });

        return inflater.inflate(R.layout.fragment_login, container, false);
    }

    @Override
    public void onDestroyView() {
        // 记注,如果 Fragment 销毁,请也销毁绑定的 LGFObservable,这段可写在基类里
        LGFObservable.lgf().removeObserver(this);
        super.onDestroyView();
    }
}

相关文章

网友评论

      本文标题:Android 封装系统 Observable 实现访 IOS

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