首页 » Android » Android 手动撸出一个事件总线框架 一 Activity上主线程的通

Android 手动撸出一个事件总线框架 一 Activity上主线程的通

原文 http://blog.csdn.net/z979451341/article/details/79162303

2018-01-25 17:40:44阅读(261)

首先我要取名这个未来诞生的事件总线框架名字为EventLine,看起来不错吧,额,不过这是装X,这个系列的博客主要讲解如何实现事件总线,我的思路主要是通过泛型和反射来实现。


我做的事件总线传递信息是通过实体类,为了好用,这个实体类必须用户来定义,所以泛型就用上场了,然后存储各个Activity的时候都是保存为Activity类型,事件总线的接收函数名也是固定的,所以使用反射能够统一处理。


首先创建一个专门为了实现事件总线的工具类并用单例模式

    public static EventLine eventLine;
    private EventLine(){
    }
    public static EventLine getInstance(){
        if(eventLine == null){
            synchronized (EventLine.class){
                if(eventLine == null)
                    eventLine = new EventLine();
            }
        }
        return eventLine;
    }

然后我们需要保存各个Activity,顺便实现退出全部Activity

    private ArrayList<Activity> activities = new ArrayList<Activity>();
    public void addActivity(Activity activity){
        activities.add(activity);
    }
    public void removeActivity(Activity activity){
        activities.remove(activity);
    }
    public void finishAll(){
        for(Activity activity : activities){
            activity.finish();
        }
    }
现在能够在Activity里注册和注销了

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventLine.getInstance().addActivity(this);
    }
    @Override
    protected void onDestroy() {
        EventLine.getInstance().removeActivity(this);
        super.onDestroy();
    }
但是真正的功能还没实现,遍历保存的Activity,然后通过反射调用receive函数,并通过泛型把参数传输通过

    public void postData(T ojb){
        for(Activity activity : activities){
            Class<? extends Activity> cls = activity.getClass();
            try {
                Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass());
                declaredMethod.invoke(activity, (Object) ojb);
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
    }
在Activity里添加接收函数

    public void receive(DataBean dataBean){
        Log.v("zzw","MainActivity 接收到了"+dataBean.data);
    }
触发消息传递
                DataBean dataBean = new DataBean();
                dataBean.data = "来自ThreeActivity的消息";
                EventLine.getInstance().postData(dataBean);
效果良好

01-25 14:20:57.673 22209-22209/com.example.zth.eventline V/zzw: MainActivity 接收到了来自ThreeActivity的消息
01-25 14:20:57.673 22209-22209/com.example.zth.eventline V/zzw: TwoActivity 接收到了来自ThreeActivity的消息



完整的事件总线代码如下:
public class EventLine<T> {
    public static EventLine eventLine;
    private EventLine(){
    }
    public static EventLine getInstance(){
        if(eventLine == null){
            synchronized (EventLine.class){
                if(eventLine == null)
                    eventLine = new EventLine();
            }
        }
        return eventLine;
    }
    private ArrayList<Activity> activities = new ArrayList<Activity>();
    public void addActivity(Activity activity){
        activities.add(activity);
    }
    public void removeActivity(Activity activity){
        activities.remove(activity);
    }
    public void finishAll(){
        for(Activity activity : activities){
            activity.finish();
        }
    }
    public void postData(T ojb){
        for(Activity activity : activities){
            Class<? extends Activity> cls = activity.getClass();
            try {
                Method declaredMethod = cls.getDeclaredMethod("receive", ojb.getClass());
                declaredMethod.invoke(activity, (Object) ojb);
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
    }
}


下一次就说如何实现Activity上主线程和子线程的通讯














最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹