美文网首页
通过接口回调实现简易的eventbus(原创,转载请标注)

通过接口回调实现简易的eventbus(原创,转载请标注)

作者: 江南小夜 | 来源:发表于2018-03-07 16:22 被阅读58次

    eventbus是一个非常火的Android事件发布/订阅框架,主要是简化了应用程序内各组件间、组件与后台线程间的通信。今天在不是教大家怎么去使用eventbus,也不是教大家分析eventbus的源码,因为这些教程网上已经有很多很多了。今天主要是教大家怎么用接口回调的形式去实现一个简易的eventbus,如有什么bug欢迎指出,我会及时完善和改进。代码还是很简单的,下面直接上代码:

    先定义一个bean:
    /**
     * Created by genius-ye on 2018/3/7.
     */
    
    public class User {
        private String name;
        private int age;
    
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    这个bean很简单就不解释了。接下来就是主角上场了:

    /**
     * 通过接口回调实现简易的eventbus
     *
     * Created by genius-ye on 2018/3/7.
     */
    
    public class EventPresenter {
        private static final EventPresenter ourInstance = new EventPresenter();
        //    private EventCallback eventCallback;
        private Map<Activity, ArrayList<EventCallback>> map = new HashMap<>();
    
        public static EventPresenter getInstance() {
            return ourInstance;
        }
    
        private EventPresenter() {
        }
    
        /**
         * 注册
         */
        public void regist(Activity activity, EventCallback eventCallback) {
            ArrayList<EventCallback> arrayList;
            if (map.containsKey(activity)) {
                arrayList = map.get(activity);
                arrayList.add(eventCallback);
            } else {
                arrayList = new ArrayList<>();
                arrayList.add(eventCallback);
                map.put(activity, arrayList);
    
            }
        }
    
        /**
         * 发送事件
         */
        public void sendEvent(Object obj) {
            //遍历map中的value
            for (ArrayList<EventCallback> arrayList : map.values()) {
                for (EventCallback eventCallback : arrayList) {
                    if (eventCallback != null) {
                        Type[] interfacesTypes = eventCallback.getClass().getGenericInterfaces();
                        for (Type t : interfacesTypes) {
                            if (t instanceof ParameterizedType) {
                                Type[] genericType2 = ((ParameterizedType) t).getActualTypeArguments();
                                Class<?> cls = (Class<?>) genericType2[0];
                                if (obj.getClass().isAssignableFrom(cls)) {
                                    eventCallback.onMainEvent(obj);
                                }
                            }
                        }
                    }
                }
    
            }
        }
    
        /**
         * 解绑
         */
        public void unregist(Activity activity) {
            if (map.containsKey(activity)) {
                map.remove(activity);
            }
        }
    
        /**
         * 回调的接口
         * @param <T>
         */
        public interface EventCallback<T> {
            void onMainEvent(T t);
        }
    }
    
    最后就是 EventPresenter 这个类的使用了,使用也很简单:

    在要发送的activity中调用sendEvent(obj)方法:
    发送对象:EventPresenter.getInstance().sendEvent(new User("张三",20));
    发送字符串:EventPresenter.getInstance().sendEvent("hello world!");
    当然了可以发送任何object。

    在要接收的activity中注册接收:
    接收对象:

    EventPresenter.getInstance().regist(this,new EventPresenter.EventCallback<User>() {
                @Override
                public void onMainEvent(User user) {
                    showToast(user.getName()+"---"+getLocalClassName());
                    textView.setText(user.getName()+"------"+user.getAge());
                    Log.d(MainActivity.class.getSimpleName(), user.getName());
                }
            });
    

    接收字符串:

    EventPresenter.getInstance().regist(this, new EventPresenter.EventCallback<String>() {
                @Override
                public void onMainEvent(String s) {
                    Log.d(MainActivity.class.getSimpleName(), s);
                }
            });
    

    最后别忘了销毁,在activity的onDestroy()方法中:

    @Override
        protected void onDestroy() {
            super.onDestroy();
            EventPresenter.getInstance().unregist(this);
        }
    

    到此就已经全部写完了,要是觉得还不错的话就可以用在你的项目中!

    相关文章

      网友评论

          本文标题:通过接口回调实现简易的eventbus(原创,转载请标注)

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