Evtor —— Android便捷事件定向订阅总线

Evtor —— Android便捷事件定向订阅总线

Evtor —— Android便捷事件定向订阅总线

一个简洁的事件总线框架。能订阅特定事件和广播事件,数据传递等。

ObsEvent便捷,不用实现接口,秩序简单的注解订阅就能接收到事件。

效果图

以下简单地用Log展示了下效果

Evtor —— Android便捷事件定向订阅总线

功能简介

  • 指定事件订阅者
  • 向特定的订阅者发送事件
  • 发送事件能传递数据
  • 能同时订阅多个事件
  • 定义广播事件

使用方法

  • dependencies中添加依赖

    dependencies {
        implementation 'com.yhy.event:evtor:latestVersion'
    }
    
  • 注册和注销观察者

    可以是任何类,这里以Activity为例

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 注册观察者
            Evtor.evtor().observe(this);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 注销观察者
            Evtor.evtor().cancel(this);
        }
    }
    
  • 在观察者中订阅事件

    订阅形式多种多样,以下一一举例

    • 单订阅者

      指定一个订阅者名称,发送事件时直接发送到该订阅者上,也只能接受该名称的事件

      单订阅者最多接收一个参数

      如果触发事件时未传递任何数据,只会触发空参数的同名订阅者;否则将触发所有同名订阅者

      // 订阅者名称为“single”,不接收任何数据
      @Subscribe("single")
      public void single() {
          log("单一订阅 —— 无数据");
      }
      
      // 订阅者名称为“single”,接收一个“String”类型数据
      @Subscribe("single")
      public void single(String data) {
          log("单一订阅 —— 有数据:" + data);
      }
      
    • 单默认订阅者

      当未指定@Subscribe注解中订阅者名称时,默认使用方法名作为订阅者名称

      其他均与“单订阅者”用法相同

      @Subscribe
      public void defSingle() {
          log("默认单一订阅 —— 无数据");
      }
      
      @Subscribe
      public void defSingle(String data) {
          log("默认单一订阅 —— 有数据:" + data);
      }
      
    • 多订阅者

      指定多个订阅者名称,只要触发其中一个,就会执行该订阅方法

      多订阅者最多接受两个参数

      如果触发事件时为传递任何数据,也只会触发空参数同名订阅者;否则就取决于订阅者,一个参数的订阅者接收到的参数为触发时所传递的数据,对于两个参数的订阅者,第一个参数是订阅者名称,第二个参数才是传递过来的数据

      @Subscribe({"multi-1", "multi-2"})
      public void multi() {
          log("多订阅 —— 无数据");
      }
      
      @Subscribe({"multi-1", "multi-2"})
      public void multi(String data) {
          log("多订阅 —— 有数据:" + data);
      }
      
      @Subscribe({"multi-1", "multi-2"})
      public void multi(String subscriber, String data) {
          log("多订阅 —— 订阅者:" + subscriber + ",有数据:" + data);
      }
      
    • 广播订阅者

      注解时需要指定为广播

      能接收到所有的事件

      最多接收两个参数

      参数接收规则与“多订阅者”相同

      @Subscribe(broadcast = true)
      public void broadcast() {
          log("广播订阅 —— 无数据");
      }
      
      @Subscribe(broadcast = true)
      public void broadcast(String data) {
          log("广播订阅 —— 有数据:" + data);
      }
      
      @Subscribe(broadcast = true)
      public void broadcast(String subscriber, String data) {
          log("广播订阅 —— 订阅者:" + subscriber + ",有数据:" + data);
      }
      
  • 触发事件,并传递数据

    可以在子线程中发送事件,所有事件均处理到了主线程

    tvSingle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 发送到单订阅者“single”,发送的数据为“single-data”
            // 空参数和一个参数的订阅者“single”均能收到消息
            Evtor.evtor().subscribe("single").emit("single-data");
        }
    });
    
    tvDefSingle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 发送到默认订阅者“defSingle”,发送的数据为“defSingle-data”
            Evtor.evtor().subscribe("defSingle").emit("defSingle-data");
        }
    });
    
    tvMulti.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 发送到多订阅者中的任何之一,并传递数据
            // 如:发送 multi-2-data 到 订阅者 “multi-2”
            // 此时所有订阅了“multi-2”的订阅者都能收到消息,包括这样的单订阅者
            String subscriber = "multi-" + (new Random().nextInt(2) + 1);
            Evtor.evtor().subscribe(subscriber).emit(subscriber + "-data");
        }
    });
    
  • 可能要注意下

    对于一个订阅者,接收数据时的参数类型最好与发送时数据类型相同,以免触发失败!


飞到Github去瞄瞄~~

貌似就这样了吧~~ ????