RxBus实现页面值的回传

来源:互联网 发布:mac玩游戏怎么样 编辑:程序博客网 时间:2024/06/07 07:48
一,我本想着研究RxBus如Intent那样定向传值,但是技术有限或者是本就不能实现,我只做出了页面的回传值,比如第a1页面跳转到a2页面,a2页面返回的时候带回需要的值。    1.首先添加依赖,       compile 'io.reactivex.rxjava2:rxjava:2.0.8'           compile 'io.reactivex.rxjava2:rxandroid:2.0.1'    2.RxBus本不是库,而是一种模式,现在我们需要两个接口类来配置一下;    public interface Function<Result, Param> {    Result function(Param... data);}-----------------------------------public interface IObservable<T, P, R> {    /**     * 根据名称注册观察者     */    void registerObserver(String name, T observer);    /**     * 根据名称反注册观察者     */    void removeObserver(String name);    /**     * 根据观察者反注册     */    void removeObserver(T observer);    /**     * 根据名称和观察者反注册     */    void removeObserver(String name, T observer);    /**     * 根据名称获取观察者     */    Set<T> getObserver(String name);    /**     * 清除观察者     */    void clear();    /**     * 通知观察者     *     * @param name 名称     * @param p    参数     */    R notify(String name, P... p);}---------------------------3.创建RxBus类如下; public class RxBus<Param, Result> implements IObservable<Function, Param, Result> {    private static final String TAG = "RxBus";    private HashMap<String, Set<Function>> _mapping;    private final Object _lockObj = new Object();    private static RxBus _instance;    public RxBus() {        this._mapping = new HashMap<>();    }    public static RxBus newInstance() {        if (_instance == null) _instance = new RxBus();        return _instance;    }    @Override    public void registerObserver(String name, Function observer) {        synchronized (_lockObj) {            Set<Function> observers;            if (!_mapping.containsKey(name)) {                observers = new HashSet<>();                _mapping.put(name, observers);            } else {                observers = _mapping.get(name);            }            observers.add(observer);        }    }    @Override    public void removeObserver(String name) {        synchronized (_lockObj) {            _mapping.remove(name);        }    }    @Override    public void removeObserver(Function observer) {        synchronized (_lockObj) {            for (String key : _mapping.keySet()) {                Set<Function> observers = _mapping.get(key);                observers.remove(observer);            }        }    }    @Override    public void removeObserver(String name, Function observer) {        synchronized (_lockObj) {            if (_mapping.containsKey(name)) {                Set<Function> observers = _mapping.get(name);                observers.remove(observer);            }        }    }    @Override    public Set<Function> getObserver(String name) {        Set<Function> observers = null;        synchronized (_lockObj) {            if (_mapping.containsKey(name)) {                observers = _mapping.get(name);            }        }        return observers;    }    @Override    public void clear() {        synchronized (_lockObj) {            _mapping.clear();        }    }    public Result notify(String name, Param... param) {        synchronized (_lockObj) {            if (_mapping.containsKey(name)) {                Set<Function> observers = _mapping.get(name);                for (Function o : observers) {                    return (Result) o.function(param);                }            }            return null;        }    }}-------------------------------------ai页面要做的是接收数据 主要代码如下;    private void initView() {        but = (Button) findViewById(R.id.but);        but.setOnClickListener(MainActivity.this);        text = (TextView) findViewById(R.id.text);        RxBus.newInstance().registerObserver("TT", new Function() {            @Override            public Object function(Object[] data) {                text.setText((String)data[0]);                return null;            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();//注销监听        RxBus.newInstance().removeObserver("TT");    }a2页面主要做的是传送数据主要代码如下;  @Override    public void onClick(View view) {        if (view.getId() == R.id.but) {            RxBus.newInstance().notify("TT", "黄家驹");        } else if (view.getId() == R.id.text) {            finish();        }    }好了就这样很简单的值的回传。我本菜鸟,还做不到灵活运用,我相信还有很多功能没开发出来,这只是一小步,后边如果有新的发现我会继续发出来的;不喜勿喷/

原创粉丝点击