EventBus手写简单实现

博客主要介绍了线程类型的定义、注解的定义、反射方法的封装、EventBus类的实现以及相关使用,这些内容均与信息技术领域的编程开发密切相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.线程类型的定义

package com.demo.administrator.eventbus.eventbus;

public enum ThreadMode {
    POSTING,
    MAIN,
    BACKGROUND,
    ASYNC
}

2.注解的定义

package com.demo.administrator.eventbus.eventbus;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Subscribe {
    ThreadMode threadMode() default ThreadMode.POSTING;
}

3.反射方法的封装

package com.demo.administrator.eventbus.eventbus;

import java.lang.reflect.Method;

public class MethodManager {
    //方法的参数
    private Class<?> paramType;
    //方法的名字
    private Method method;
    //注解的类型
    private ThreadMode threadMode;

    public MethodManager(Class<?> paramType, Method method, ThreadMode threadMode) {
        this.paramType = paramType;
        this.method = method;
        this.threadMode = threadMode;
    }

    public Class<?> getParamType() {
        return paramType;
    }

    public void setParamType(Class<?> paramType) {
        this.paramType = paramType;
    }

    public Method getMethod() {
        return method;
    }

    public void setMethod(Method method) {
        this.method = method;
    }

    public ThreadMode getThreadMode() {
        return threadMode;
    }

    public void setThreadMode(ThreadMode threadMode) {
        this.threadMode = threadMode;
    }
}

4.EventBus类的实现

package com.demo.administrator.eventbus.eventbus;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class EventBus {
    private static volatile EventBus instance;
  // Map<key,value> key为注册的Activity或者Fragment,value为该key含有的EventBus注解的方法集合
    private Map<Object, List<MethodManager>> mapCaches;

    private EventBus() {
        mapCaches = new HashMap<>();
    }

    public static EventBus getDefault() {
        if (null == instance) {
            synchronized (EventBus.class) {
                if (null == instance) {
                    instance = new EventBus();
                }
            }
        }
        return instance;
    }

    public void register(Object getter) {
        List<MethodManager> methodsList = mapCaches.get(getter);
        if (methodsList == null || methodsList.size() == 0) {
            methodsList = new ArrayList<>();
            Class<?> clazz = getter.getClass();
            //获取所有的公共方法,包括父类
            Method[] methods = clazz.getMethods();
            String clazzName = clazz.getName();
            while(clazz!=null){
            //如果父类为java.,javax.,android.开头的,认为是系统类直接返回
            if (clazzName.startsWith("java.") ||
                    clazzName.startsWith("javax.") || clazzName.startsWith("android.")) {
                return;
            }
            for (Method method : methods) {
                //获取该方法是否含有EventBus注解
                Subscribe annotation = method.getAnnotation(Subscribe.class);
                if (annotation == null) {
                    continue;
                }
                Type type = method.getGenericReturnType();
                if (!"void".equals(type.toString())) {
                    throw new RuntimeException(method.getName() + "返回值类型必须为void类型");
                }
                Class<?>[] parameterTypes = method.getParameterTypes();
                if (parameterTypes.length != 1) {
                    throw new RuntimeException(method.getName() + "参数个数必须为1");
                }
                MethodManager methodManager = new MethodManager(parameterTypes[0],
                        method, annotation.threadMode());
                methodsList.add(methodManager);
            }
            }
            mapCaches.put(getter, methodsList);
        }
    }

    public void post(Object setter) {
        Set<Object> set = mapCaches.keySet();
        for (Object getter : set) {
            List<MethodManager> methodList = mapCaches.get(getter);
            if (methodList != null) {
                for (MethodManager methodManager : methodList) {
                    if (methodManager.getParamType().isAssignableFrom(setter.getClass())) {
                        try {
                            methodManager.getMethod().invoke(getter, setter);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    public void unregister(Object getter) {
        mapCaches.remove(getter);
    }
}

5.使用

package com.demo.administrator.eventbus;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.demo.administrator.eventbus.eventbus.EventBus;
import com.demo.administrator.eventbus.eventbus.Subscribe;
import com.demo.administrator.eventbus.eventbus.ThreadMode;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // EventBus.register(this);
        EventBus.getDefault().register(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void eventBus(UserBean userBean) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值