Otto事件总线框架的使用
Otto是一个在Android中的事件总线框架,它是square的一个开源框架,具体介绍点击这里,项目下载点击这里
为什么要使用Otto事件总线:
通常来说在Android中:
1、Activity与Activity间的传值是通过Intent,值回调是通过startActivityForResult()
2、Activity与Fragment间的传值是通过setArguments,值回调是通过实现onAttach()的Interface方式
3、而Fragment与Fragment间的交互则应该是通过它们关联的Activity作为中间键来交互
4、包括Activity与Service的交互,可能众多同学会采用Binder机制来处理,而其实Binder机制本质也是通过接口回调方式来进行值回调的
5、或者在更复杂的应用场景下,比如:ActivityA跳转到ActivityB,ActivityB跳转到ActivityC,此时需要从ActivityC中获取到用户的操作数据返回到ActivityA和ActivityB中显示,或者在Activity中有多个Fragment,其中一个Fragment里的数据变化需要同步更新其它Fragment的数据变化,这时候如果使用Interface的方式进行它们间的交互则比较复杂,耦合度也高
所以,针对上面这些问题,大多数在处理值交互的问题上类之间都是耦合在一起的,而Otto事件总线框架就是降低各个类间的耦合度的。
Otto事件总线
Otto中真正用到的就只有一个类两个注解三个方法:
Bus- 管理注册、注销和发布事件@Produce- 标记该方法是生产者,产生的事件内容为该方法的返回值@Subscribe- 标记该方法是订阅者,表示订阅了一个事件,方法需要修饰符为public,而区分不同的订阅者是通过方法的参数来区分的,且订阅了某事件的所有订阅者都可以收到该事件register(Object obj)- 注册,订阅事件前都需要注册unregister(Object obj)- 注销,放弃之前所有事件的订阅post(Object event)- 发布一个事件,这个事件会被所有标记了@Subscribe注解的方法获得
使用Otto事件总线
首先添加依赖:
dependencies {
compile 'com.squareup:otto:+'
}
1、为了避免重复创建Bus对象,我们先为Bus创建一个单例对象
public class BusProvider {
private volatile static Bus bus = null;
private BusProvider() {
}
public static Bus getInstance() {
if (bus == null) {
synchronized (BusProvider.class) {
bus = new Bus();
}
}
return bus;
}
}
2、创建一个Bean,用来传递各类间的数据
public class EventData {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
3、在MainActivity中注册并且创建订阅者订阅数据
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BusProvider.getInstance().register(this);//订阅事件
Button mButton = (Button) findViewById(R.id.btn);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TestActivity.jumpToTestActivity(MainActivity.this);
}
});
}
@Subscribe
public void subscribeEvent(EventData data){
Log.v("zxy", data.getContent());
}
@Override
protected void onDestroy() {
super.onDestroy();
BusProvider.getInstance().unregister(this);//注销订阅
}
public static void jumpToMainActivity(Context context){
context.startActivity(new Intent(context,MainActivity.class));
}
}
4、在TestActivity中发布事件
发布事件有两种方法:
1、使用@Produce注解来生产事件,不过它生产事件前它需要注册、生产完事件后需要注销,如果使用这种方法则在跳转到生产者所在的类中则会立即产生事件触发订阅者,即在MainActivity跳转到TestActivity时,会立即产生事件并订阅了该事件的方法会收到该事件,如:
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
BusProvider.getInstance().register(this);
}
@Produce
public EventData produceEvent(){
EventData mEventData = new EventData();
mEventData.setContent("hello word!");
return mEventData;
}
@Override
protected void onDestroy() {
super.onDestroy();
BusProvider.getInstance().unregister(this);
}
public static void jumpToTestActivity(Context context){
context.startActivity(new Intent(context, TestActivity.class));
}
}
则在MainActivity跳转到TestActivity时订阅者会马上收到事件,输出的Log信息为:
09-06 03:46:16.738 5958-5958/? V/zxy﹕ hello word!
2、通过post()来发布事件,它不需要注册和注销,而且它不会在界面跳转时马上发布事件,而是我们人为的控制该事件什么时候发布,使用如下:
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
public void click(View view){
EventData mEventData = new EventData();
mEventData.setContent("hello word!");
BusProvider.getInstance().post(mEventData);//发布事件
MainActivity.jumpToMainActivity(this);
}
public static void jumpToTestActivity(Context context){
context.startActivity(new Intent(context, TestActivity.class));
}
}
当我们点击按钮时候,这个事件就发布出去了,而订阅了该事件的方法就会收到,打印的Log为:
09-06 03:46:18.738 5958-5958/? V/zxy﹕ hello word!
【注】:发布事件需要发布的是一个Object对象,而且这个对象不能为null,所以在数据量大的时候我们可以创建个Bean类,而传当个数据时候如字符串等则直接传String就好。
可以看到通过Otto事件总线来处理类与类之间的交互,可以使得我们的代码更容易理解,类与类之间也解耦了
Otto事件总线框架的使用的更多相关文章
- Android学习系列(43)--使用事件总线框架EventBus和Otto
事件总线框架 针对事件提供统一订阅,发布以达到组件间通信的解决方案. 原理 观察者模式. EventBus和Otto 先看EventBus的官方定义: Android optimized event ...
- 事件总线框架---Otto
我们假设这样一种业务场景,现在在做一款及时聊天应用,我们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时我们该如何去实现?说说我以前的实现策略,我使用的是广播接收器BroadCastR ...
- android开源项目之OTTO事件总线(二)官方demo解说
官方demo见 https://github.com/square/otto 注意自己该编译版本为2.3以上,默认的1.6不支持match_parent属性,导致布局文件出错. 另外需要手动添加an ...
- android开源项目之OTTO事件总线(一)
Otto是由Square发布的一个着重于Android支持的基于Guava的强大的事件总线,在对应用程序不同部分进行解耦之后,仍然允许它们进行有效的沟通. 开源项目地址:https://github. ...
- EventBus事件总线框架(发布者/订阅者模式,观察者模式)
一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. In ...
- Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析
前言:Otto事件总线 -- 组件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle.intent等,从activityA --- activit ...
- 事件总线帧---Otto
我们如果这样一种业务场景.如今在做一款及时聊天应用,我们在聊天页面进行收发信息.同一时候也要实时更新前一页面的聊天记录,这时我们该怎样去实现?说说我曾经的实现策略.我使用的是广播接收器BroadCas ...
- AndroidEventBus ( 事件总线 ) 的设计与实现
1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,非常大程度上减少了它们之间的耦 ...
- Android事件总线EventBus详解
顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...
随机推荐
- 有一台机器,上面有m个储存空间。然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i])。问怎么安排这n个请求的顺序,使
有一台机器,上面有m个储存空间.然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i]).问怎么安排这n个请求的顺 ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...
- Spark技术内幕:Shuffle Pluggable框架详解,你怎么开发自己的Shuffle Service?
首先介绍一下需要实现的接口.框架的类图如图所示(今天CSDN抽风,竟然上传不了图片.如果需要实现新的Shuffle机制,那么需要实现这些接口. 1.1.1 org.apache.spark.shuf ...
- 值集&快速编码(Lookup_code)
--值集 SELECT ffv.flex_value, ffv.description FROM fnd_flex_values_vl ffv, fnd_flex_value_sets ffs ...
- RxJava(01-介绍与初体验)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51612415 本文出自:[openXu的博客] 目录: 一 简介 二 简单使用 初步探索 代 ...
- OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析
欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法 ...
- 在代码中写view 的长宽高等
获得资源的id的另一种方法 int layoutRes = getResources().getIdentifier("pager_view" + i, "layout& ...
- Eclipse打jar包,资源文件的读取
最近的工作中需要将java程序打一个jar包,然后在Linux中供调用.程序中需要读取一个配置文件.遇到了三个问题.第一个是依赖的第三方Jar包打成Jar包后找不到:第二个问题是资源文件所在的文件夹打 ...
- Hibernate之配置文件
可持久化对象有以下三种状态: 临时状态(Transient):对象在保存进数据库之前为临时状态,这时数据库中没有该对象的信息,如果没有持久化,程序退出后临时状态的对象信息将会丢失.随时可能被垃圾回收器 ...
- UNIX网络编程——epoll 的accept , read, write(重要)
在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK). 从字面上看,意思是: EAGAIN: 再试一次 E ...