Android Otto框架

转载自:https://my.oschina.net/jack1900/blog/304081,http://www.jianshu.com/p/c8ff4a999a28


otto 框架就是事件分发总线.
otto 下载地址:http://square.github.io/otto/

1.0 为什么要使用事件分发总线?

事件分发总线可以降低多个类之间的耦合度的。
在 android 中 Fragment 对 Activity 的通信方式的 Interface 的方式,Activity 和 Activity 的值的回调是用 startActivityForResult()的方法.Fragment 和 Fragment中的通信是用 Interface 的方式...
现在有一个新的方式:使用事件分发总线.它可以替代这些操作,并且写法更加的简单.

2.0为什么要使用 otto 框架?与Eventbus 比较呢?

Eventbus是一个非常强大的一个框架,它采用的使用特定的方法名的方式接受消息.
就功能来讲, eventbus 也胜一筹,因为它定义了很多个操作类型,包括异步线程,主线程调用等.

之所以选择 otto, 而不使用 eventBus, 因为otto 使用注解的形式,注解更能被程序员识别.并且避免了因为拼写不正确导致的事件不起作用.

3.0.什么时候使用otto

在处理Fragment 和 Fragment的通信,Activity 和Fragment 的通信, Activity 和 Activity的通信...
在比较复杂的场景:
1.由界面 A 跳转到界面 B 再跳转到 界面C, 然后点击 C中的 button, 现在要更新 界面 A 和界面 B 的视图
2.界面有一个 界面 A,A 里面的有个 Fragment, 点击 Fragment 中的一个 button,跳转到界面 B, 点击界面 B的 button 要更新界面 A 的 Fragment 的视图.
可以看出上面举例的两种如果用startActivityForResult 和 interface 的方式实现的话,会比较麻烦,并且产生了很多的状态判断和逻辑判断,并且可能产生很多不必要的 bug, 使代码量变大,使用 otto 就可以能容易的避免这些.

4.0 主要方法

主要的方法有3个,够少吧.
register(Object o):注册,注册以后可以订阅事件
unregister(Object o)注销.放弃对之前的订阅的所有事件
post(Object o)发布事件,会被有Subscribe注解的方法获取到
注解:
@Subscribe:这个在调用了register后有效,表示订阅了一个事件,并且方法的用 public 修饰的.方法名可以随意取,重点是参数,它是根据你的参数进行判断
@Produce注解告诉Bus该函数是一个事件产生者,产生的事件类型为该函数的返回值。

5.0 otto 框架使用例子

现在我们的任务是界面 A 跳转到界面 B, 点击 B 的 button 更新 A 的视图.
首先我们要自行实现单例模式.
使用以下BusProvider.class类实现单例

/**
 * Maintains a singleton instance for obtaining the bus. Ideally this would be replaced with a more efficient means
 * such as through injection directly into interested classes.
 */
public final class BusProvider {
    private static final Bus BUS = new Bus();

    public static Bus getInstance() {
        return BUS;
    }

    private BusProvider() {
        // No instances.
    }
}

定义一个 class ,用于界面 B 要传递会界面 A 的参数

/**
 * Created by zzz40500 on 15/1/14.
 */
public class TestAction {


    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}

A.class

public class A extends ActionBarActivity {


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

        BusProvider.getInstance().register(this);

    }

    //这个注解一定要有,表示订阅了TestAction,并且方法的用 public 修饰的.方法名可以随意取,重点是参数,它是根据你的参数进行判断
    @Subscribe
    public void testAction(TestAction testAction){
     //这里更新视图或者后台操作,从TestAction获取传递参数.
    }

    @Override
    public void onDestroy() {
        BusProvider.getInstance().unregister(this);
        super.onDestroy();
    }
}

在界面 B

public class B extends ActionBarActivity {


    private Button button;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        button= (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TestAction testAction=new TestAction();
                testAction.setStr("click");
                BusProvider.getInstance().post(testAction);
            }
        });
    }

}

总结:

otto 是一个非常优秀和强大的框架.
在它的使用过程发现:其实你在发布事件的时候并不需要register这个类,而且也可以不使用Produce这个注解,你只要调用这个 BusProvider.getInstance().post(object)方法就可以了,他就会分发事件,这样是不是会更方便呢.
但是你要Subscribe订阅事件就一定要register这个类了,否则是接受不到事件的.
otto 传递事件的时候,参数最后用一个实体类包裹着.因为有些参数不能直接传递.



文/轻微(简书作者)
原文链接:http://www.jianshu.com/p/c8ff4a999a28
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

摘要: Event Bus模型为开发带来了巨大的福利,开发者只须通过简单的代码就能实现复杂的事件交互需求。想了解详情请猛戳

我们假设这样一种业务场景,现在在做一款及时聊天应用,我们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时我们该如何去实现?说说我以前的实现策略,我使用的是广播接收器BroadCastReceiver,在接收和发送消息的时候就不停去发送广播,然后在需要实时更新的地方进行接收更新。实现的思想比较简单,也不存在代码上的耦合问题,但是有个弊端。弊端就是需要去在很多地方实现BroadCastRecevier,代码虽不算冗余,但比较多,看起来很是不爽。

今天为大家介绍的Otto,就能彻底解决代码体积的问题。Otto是一款目前比较流行事件总线框架,旨在保持应用各页面和模块之间通信高效的前提下,对应用进行解耦。Otto的使用很简单,源码也只就9个类,几千行代码,开放出来的api也间接明了。Otto是基于订阅/发布(Subscribe/Publish)这样一种设计模式,简单来说,如果你想订阅某个消息,使用@Subcribe注解即可进行接收,同时使用

Bus.post(Object obj)进行消息的发布,这样的设计达到了完全的解耦。

下面分步骤为大家简单介绍下使用过程。

一、Bus实例化

Bus这个类是整个框架的灵魂,它负责消息的发布和接收,整个流程都是经过这个Bus去实现的。Bus的实例化推荐使用单例,就是说整个应用内只实例化一个Bus对象,所有的消息的处理都是经过这单一的实例去实现。因为要实现消息的接受者接收到发布的消息,一定要经过同一个Bus对象的处理。Bus的构造器可以接收ThreadEnforcer类型的参数,ThreadEnforcer其实是一个接口,它自身有两个实现,分别表示Bus运行在Main Thread中还是异步线程中。

二、注册和解绑Bus

根据具体的业务需求进行Bus的注册和解绑,对于android中的组件,一般是基于生命周期方法中去实现;同时如果是任意你自定义的类中都可以进行。下面展示的是在Activity和Fragment里面实现。

三、消息的发布

发布消息是整个框架中最重要的部分,它允许你告诉所有的订阅者一个事件已经触发。任何一个类的实例对象都可以通过总线Bus去发布,同时也只能被订阅这种对象的接受者所接收。下面展示的是通过Bus去发布一个消息,消息的内容是LocationChangeEvent,所以LocationChangeEvent的接受者都能接收到此发布的消息。注意的是,发布消息只能一个Object对象。

四、消息的订阅

消息的订阅和发布之前都要在当前的类中进行Bus的注册。订阅是对消息发布的补充,当消息发布的事件调用之后,对应的消息订阅者就能立即接收到此消息。实现订阅功能是通过自定义方法实现的,方法的名称可以随意,同时还得需要满足三个条件。

1、方法前使用@Subscribe注解

2、访问修饰符为public

3、单一参数,根据你想订阅的消息进行设置

注:使用之前,记得进行注册;使用完毕,记得释放。

五、消息的produce

当订阅者注册完毕,针对特定的消息,通常也需要获取当前已知的值。这个时候,就需要用到produce。同样的使用produce的方法名称可以随意,同时有三点需要注意。

1、方法前使用@produce注解

2、访问修饰符为public

3、无参,返回值是基于订阅者参数类型

好了,Otto的使用就是这些了。快去重构代码,摆脱无尽的广播吧!

当然Otto的缺点也是有的,要实现上述订阅/发布模型的功能,付出的代价就是对各个注册Bus的类进行反射。如果大量的使用的情况下,对应用的性能多少有点副影响。


Otto源码和Demo地址:https://github.com/square/otto


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值