当前位置: 首页 > 工具软件 > EventBus > 使用案例 >

伪EventBus:根据EventBus原理实现自己的EventBus

贺跃
2023-12-01

1 注册事件

 if (!MyEventBus.getDefault().isRegistered(this)) {
      MyEventBus.getDefault().register(this);
 }

2 反注册事件

if (MyEventBus.getDefault().isRegistered(this)) {
     MyEventBus.getDefault().unRegister(this);
}

3 判断当前是否注册了事件

MyEventBus.getDefault().isRegistered(this)

4 事件回掉

   /**
     * 运行在UI线程
     * @param msg
     */
    public void onEventUIThread(MyEvent msg) {
        Log.e("TAG","onEventUIThread----->" + msg.eventName + "........" + msg.eventData);
    }

    /**
     * 运行在子线程
     * @param msg
     */
    public void onEventNewThread(MyEvent msg) {
        Log.e("TAG","onNewThread----->" + msg.eventName + "........" + msg.eventData);
    }

    /**
     * 运行在当前线程
     * @param msg
     */
    public void onEventCurrentThread(MyEvent msg) {
        Log.e("TAG","onEventCurrentThread----->" + msg.eventName + "........" + msg.eventData);
    }

5 发送普通事件

 MyEventBus.getDefault().postSticky(new MyEvent("测试数据",false,System.currentTimeMillis()));

6 发送粘性事件

 MyEventBus.getDefault().postSticky(new MyEvent("测试数据",true,System.currentTimeMillis()));

7 整体EventBus类

/***
 * 日期: 2019/4/3 11:52
 * 姓名: bjs
 * 说明: 自定义EventBus类
 */
public class MyEventBus {
    private MyEvent myStickyEvent;
    //运行在UI线程
    private static final String MATHER_NAME_UI_THREAD = "onEventUIThread";
    //运行在子线程
    private static final String MATHER_NAME_NEW_THREAD = "onEventNewThread";
    //运行在当前线程
    private static final String MATHER_NAME_CURRENT_THREAD = "onEventCurrentThread";

    private static ArrayList<Activity> arrayList = new ArrayList<>();
    private volatile static MyEventBus instance;
    private Handler handlerMain = new Handler(Looper.getMainLooper());

    private MyEventBus() {
    }

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

        return instance;
    }

    /**
     * 注册事件
     * @param subscriber
     */
    public void register(Activity subscriber) {
        if (!arrayList.contains(subscriber)) {
            arrayList.add(subscriber);
        }

        //判断是否有粘性事件
        if (myStickyEvent != null) {
            openMethod(subscriber,myStickyEvent);
        }
    }

    /**
     * 反注册事件
     * @param subscriber
     */
    public void unRegister(Activity subscriber) {
        for (int i = 0; i < arrayList.size(); i++) {
            if (arrayList.contains(subscriber)) {
                arrayList.remove(subscriber);
            }
        }
    }

    /**
     * 判断当前是否注册了事件
     * @param subscriber
     * @return
     */
    public boolean isRegistered(Activity subscriber) {
        for (int i = 0; i < arrayList.size(); i++) {
            return arrayList.contains(subscriber);
        }
        return false;
    }

    /**
     * 发送普通的事件
     * @param eventMsg
     */
    public void post(MyEvent eventMsg) {
        //通过反射获取方法,
        for (int i = 0; i < arrayList.size(); i++) {
            openMethod(arrayList.get(i),eventMsg);
        }
    }

    /**
     * 发送粘性事件
     * @param eventMsg
     */
    public void postSticky(MyEvent eventMsg) {
        if (eventMsg.isSticky()) {
            myStickyEvent = eventMsg;
        }
        post(eventMsg);
    }

    /**
     * 清除内存中的粘性事件
     */
    public void clearSticky() {
        myStickyEvent = null;
    }

    private void openMethod(Activity activity, MyEvent eventMsg) {
        try {
            Class cls = activity.getClass();
            //第一个参数是被调用方法的名称,后面接着这个方法的形参类型
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                switch (method.getName()) {
                    case MATHER_NAME_UI_THREAD://UI线程
                        handlerMain.post(()->invokeMethod(activity,method,eventMsg));
                        break;

                    case MATHER_NAME_NEW_THREAD://子线程
                        new Thread(()->invokeMethod(activity,method,eventMsg)).start();
                        break;

                    case MATHER_NAME_CURRENT_THREAD://当前线程
                        invokeMethod(activity,method,eventMsg);
                        break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void invokeMethod(Activity activity, Method method, MyEvent eventMsg) {
        try {
            method.invoke(activity,eventMsg);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

8 整体事件类

/***
 * 日期: 2019/4/3 11:56
 * 姓名: bjs
 * 说明: 自定义消息类
 */
public class MyEvent {
    public String eventName; //事件名称
    public boolean sticky;  //是否是粘性事件
    public Object eventData; //事件携带的数据

    public MyEvent(String eventName, boolean sticky, Object eventData) {
        this.eventName = eventName;
        this.sticky = sticky;
        this.eventData = eventData;
    }
}

9 整体使用类

/***
 * 日期: 2019/4/3 10:46
 * 姓名: bjs
 * 说明: 使用EventBus的类
 */
public class BeforeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_before);

        initView();

        //注册
        if (!MyEventBus.getDefault().isRegistered(this)) {
            MyEventBus.getDefault().register(this);
        }
    }

    private void initView() {
        findViewById(R.id.btn1).setOnClickListener(v->{
            //发送普通事件
            MyEventBus.getDefault().post(new MyEvent("测试数据",false,System.currentTimeMillis()));
           });

        findViewById(R.id.btn2).setOnClickListener(v->{
            //发送粘性事件
            MyEventBus.getDefault().postSticky(new MyEvent("测试数据",true,System.currentTimeMillis()));
        });
    }

    /**
     * 运行在UI线程
     * @param msg
     */
    public void onEventUIThread(MyEvent msg) {
        Log.e("TAG","onEventUIThread----->" + msg.eventName + "........" + msg.eventData);
    }

    /**
     * 运行在子线程
     * @param msg
     */
    public void onEventNewThread(MyEvent msg) {
        Log.e("TAG","onNewThread----->" + msg.eventName + "........" + msg.eventData);
    }

    /**
     * 运行在当前线程
     * @param msg
     */
    public void onEventCurrentThread(MyEvent msg) {
        Log.e("TAG","onEventCurrentThread----->" + msg.eventName + "........" + msg.eventData);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        //反注册
        if (MyEventBus.getDefault().isRegistered(this)) {
            MyEventBus.getDefault().unRegister(this);
        }
    }
}

-------------------------------分------------割----------线----------------------------------------------------------

 

自己为了加深理解编写,若有误望指正,不喜勿喷~~

 

 类似资料: