Android Otto框架

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 的视图.
首先我们要自行实现单例模式.
使用以下AppBus .class类实现单例


public class AppBus extends Bus{
    private static AppBus bus;
    //创建单例模式
    public static AppBus getInstance() {
        if (bus == null) {
            bus = new AppBus();
        }
        return bus;
    }
}

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


public class BusEventData {
    public String content;
     
    public BusEventData(String content) {
        this.content = content;
    }
 
    public String getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = content;
    }
}

A.class

public class MainActivity extends Activity {
    private Button btn1,btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1=(Button)findViewById(R.id.btn1);
        btn2=(Button)findViewById(R.id.btn2);
        btn1.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                AppBus.getInstance().post(new BusEventData("somebody alive"));
            }
        });
        btn2.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                AppBus.getInstance().post("hello");
            }
        });
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.container, TestFragment.getInstance());
        transaction.commit();
    }    
    
    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        AppBus.getInstance().register(this);
    }
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        AppBus.getInstance().unregister(this);
    }


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

在界面 B

public class TestFragment extends Fragment {
    private EditText mContentET;
    private Button btn;
     
    public static TestFragment getInstance() {
        TestFragment fragment = new TestFragment();
        // fragment.setArguments(args);
        return fragment;
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_test, container, false);
        mContentET = (EditText) view.findViewById(R.id.content);
        btn=(Button)view.findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                BusEventData bus=new BusEventData("测试fragment向activity发送信息");
                AppBus.getInstance().post(bus);
            }
        });
        return view;
    }
    
    @Override
    public void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        AppBus.getInstance().unregister(this);
        
    }
    
    @Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        AppBus.getInstance().register(this);
    }
    
    /**
     * 定义订阅者,Activity中发布的消息,在此处会接收到,在此之前需要先在程序中register,看
     * 上面的onStart和onStop函数
     */
    @Subscribe
    public void setContent(BusEventData data) {
        mContentET.setText(data.getContent());
    }
    @Subscribe
    public void setContent(String data) {
        mContentET.setText(data);
    }
    
    @Subscribe
    public void onDataChange(String sss) {
        System.out.println("====" + sss);
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值