android进阶3step1:Android组件通信——事件框架总线Otto

事件框架总线Otto

一、Otto是什么?

Otto是基于Guava项目的Android系统的一个EventBus模式类库,如果你在Android程序开发的过程中想要不同的组件之间进行有效的通信可以使用这个库。通过Otto库可以降低程序之间的耦合性。

二、Otto 解决了哪些问题?


1、用来简化应用程序组件之间的通讯,例如复杂的界面跳转 ActivityA 跳转到 ActivityB,ActivityB 跳转到 ActivityC,此时需要从 ActivityC 中获取到用户的操作数据返回到ActivityA 和 ActivityB 中显示,或者在 Activity 中有多个 Fragment,其中一个Fragment 里的数据变化需要同步更新其它 Fragment 的数据变化,这时候如果使用Interface 的方式进行它们之间的交互则比较复杂,耦合度也高。

2、简化了程序,使代码变得更加优美

三、Otto 如何使用?

Otto 采用注解定义订阅/发布者角色的方式:

  • @Subscribe:标明其为订阅者。通过此注解来告诉 Bus 总线,该方法订阅了一个事件, 同时 Bus 总线可以通过此注解来找到需要调用的方法;
  • @Produce:标明其为发布者;
  • register()方法:通过 Bus 类的此方法来实现某个类的注册,这样 Bus 总线便可以通过此 方法来查找注册的类;
  • unregister()方法:通过此方法实现从 Bus 事件总线中注销。

四、使用示例:

这里假设某个 Activity 发布消息数据给其 Fragment,具体使用步骤如下:

1)添加依赖

dependencies {

......
/ /Otto 所需要依赖的包
implementation 'com.squareup:otto:1.3.8'

}

2) 创建自定义 Bus 类
//使用单例模式创建 MyBus 类方便后面使用

public class MyBus extends Bus {

private static MyBus bus;
public static MyBus getInstance() {

if (bus == null) {
bus = new MyBus();

}

return bus; }

}


3)创建 TransferData 类作为组件间通信传递数据的载体

public class TransferData {

public String content;

public TransferData(String content) { 
this.content = content;
}

public String getContent() { 
return content;
}

public void setContent(String content) { 
this.content = content;
} 
}

4)在接收数据端 Fragment 里

@Override
public void onStart() {

super.onStart();
//使用 Bus 类的 register()方法注册到 bus 事件总线中

MyBus.getInstance().register(this);

}

//定义订阅者并接收来自 Activity 中的消息,参数类型为 3)中定义的类型

@Subscribe

public void setContent(TransferData data) {

 System.out.println(data.getContent());

}

//接收到数据的变化
@Subscribe
public void onMyScrollChange(ScrollEventData data) {

System.out.println(data); }

@Subscribe
public void onDataChange(String str) {

System.out.println(str); }

@Override
public void onStop() {

super.onStop();
//从 Bus 事件总线中注销

MyBus.getInstance().unregister(this);

}

5) 在发布数据 Activity 端,通过 Bus 将 TransferData 类型的数据发布到Fragment
 

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MyBus.getBusInstance().register(this); }

//注明发布者
@Produce
public TransferData produceFragmentData() {

return new TransferData("The data comes from activity"); }

//通知所有@Subscribe 匹配 TransferData 类型参数的方法执行
public void postDataToFragment(){

MyBus.getInstance().post(produceFragmentData()); }

@Override
public void onDestroy() {

super.onStop();
//从 Bus 事件总线中注销MyBus.getInstance().unregister(this);

}

五、总结:

Otto 是针对事件提供统一订阅和发布以达到组件间通信的解决方案。

作用就是简化 android 应用内组件的通信。

使用时需要注意如下两点:

  • 1)被@Subscribe,@Produce 注解的方法必须定义在直接的作用类上,而不能定义在 基类。
  • 2)发布者和订阅者都需要 register()和 unregister()。

推荐 Otto 官方网站:
http://square.github.io/otto/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值