二、订阅方法时的注解
定义一个注解 , 该注解用于修饰方法 ElementType.METHOD , 在运行时 , 用户调用 register 注册订阅者时 , 会分析哪个方法中存在该注解 , 将有注解的方法保存起来 , 以便之后的调用 ;
该注解需要保存到运行时 RetentionPolicy.RUNTIME ;
package com.eventbus_demo.myeventbus; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) // 该注解保留到运行时 @Target(ElementType.METHOD) // 该注解作用于方法 public @interface MySubscribe { /** * 注解属性, 设置线程模式, 默认是 POSTING, * 即在发布线程调用订阅方法 * @return */ MyThreadMode threadMode() default MyThreadMode.POSTING; }
三、订阅方法封装
将 订阅方法 , 订阅方法的线程模式 , 订阅方法接收的事件类型 , 封装到类中 ;
package com.eventbus_demo.myeventbus; import java.lang.reflect.Method; /** * 该类中用于保存订阅方法相关信息 */ public class MySubscriberMethod { /** * 订阅方法 */ private final Method method; /** * 订阅方法的线程模式 */ private final MyThreadMode threadMode; /** * 订阅方法接收的事件类型 */ private final Class<?> eventType; public MySubscriberMethod(Method method, MyThreadMode threadMode, Class<?> eventType) { this.method = method; this.threadMode = threadMode; this.eventType = eventType; } public Method getMethod() { return method; } public MyThreadMode getThreadMode() { return threadMode; } public Class<?> getEventType() { return eventType; } }
四、订阅对象-方法封装
再次进行封装 , 将 订阅者对象 和 订阅方法 , 封装到一个类中 , 这个类对象是 注册 , 取消注册 , 事件调用 操作的基本单元 ;
获取到该类的对象 , 就可以执行订阅方法 ;
package com.eventbus_demo.myeventbus; /** * 封装 订阅者对象 与 订阅方法 */ public class MySubscription { /** * 订阅者对象 */ private final Object subscriber; /** * 订阅方法 */ private final MySubscriberMethod subscriberMethod; public MySubscription(Object subscriber, MySubscriberMethod subscriberMethod) { this.subscriber = subscriber; this.subscriberMethod = subscriberMethod; } public Object getSubscriber() { return subscriber; } public MySubscriberMethod getSubscriberMethod() { return subscriberMethod; } }
五、线程模式
仿照 EventBus 的线程模式 , 直接照搬过来 ;
线程模式用法参考 【EventBus】Subscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC) ;
package com.eventbus_demo.myeventbus; /** * 直接使用 EventBus 中的现成模式 */ public enum MyThreadMode { POSTING, MAIN, MAIN_ORDERED, BACKGROUND, ASYNC }
六、Activity 中测试上述框架
在 Activity 中使用 @MySubscribe 注解修饰处理消息的方法 , 该方法必须是 public void 修饰的 , 只有一个参数 , 参数类型随意 , 调用 MyEventBus.getInstance().post 方法即可发送消息到该方法进行处理 ;
/** * 使用 @MySubscribe 注解修饰处理消息的方法 * 该方法必须是 public void 修饰的 * 只有一个参数 , 参数类型随意 * 调用 MyEventBus.getInstance().post 即可发送消息到该方法进行处理 * @param msg */ @MySubscribe public void onMessgeEvent(String msg){ textView.setText(msg); }
在 onCreate 方法中 , 注册订阅方法 ;
@Override
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 首先注册订阅 EventBus MyEventBus.getInstance().register(this); }
点击按钮 , 发送消息事件 , 这里发送了一个字符串 ;
textView = findViewById(R.id.textView); // 设置点击事件, 点击后发送消息 textView.setOnClickListener((View view)->{ MyEventBus.getInstance().post("Hello EventBus !"); });
完整 Activity 代码 :
package com.eventbus_demo; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import com.eventbus_demo.myeventbus.MyEventBus; import com.eventbus_demo.myeventbus.MySubscribe; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; /** * 使用 MyEventBus 依赖库 */ public class MainActivity3 extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.textView); // 设置点击事件, 点击后发送消息 textView.setOnClickListener((View view)->{ MyEventBus.getInstance().post("Hello EventBus !"); }); // 首先注册订阅 EventBus MyEventBus.getInstance().register(this); } /** * 使用 @Subscribe 注解修饰处理消息的方法 * 该方法必须是 public void 修饰的 * 只有一个参数 , 参数类型随意 * 调用 EventBus.getDefault().post 即可发送消息到该方法进行处理 * @param msg */ @MySubscribe public void onMessgeEvent(String msg){ textView.setText(msg); } @Override protected void onDestroy() { super.onDestroy(); // 取消注册 MyEventBus.getInstance().unregister(this); } }
执行效果 : 点击后 , 页面变为如下效果 ;