EventBus的使用

来源:互联网 发布:光纤星型网络结构 编辑:程序博客网 时间:2024/06/16 17:36

·什么是EventBus
EventBus是Android下高效发布和订阅事件总线的机制,它可以代替传统的Activity和Fragment之间繁琐的数据传递,比Intent和Broadcast的事件传递不知道要好用多少。它的主要机制是发布和订阅,所以也叫观察者模式。
·怎样使用
废话不多说了,直接进入主题。聪明的同学一看这个就知道它是一个第三方的库,所以也就必须要先获取到它的关联,第一种就是Jar,还有一种就是关联远程的库。同学们可以去https://github.com/greenrobot/EventBus/releases上面选择你自己喜欢的方式。
1.EventBus-2.4.0.jar,只需要把jar包放到app/lib目录下就可以了
这里写图片描述
2。关联远程库,compile ‘org.greenrobot:eventbus:3.0.0’
这里写图片描述

第一步:添加订阅事件
1.注册:EventBus.getDefault().register(this); 通常在acticvity创建的时候写注册。
2.反注册:EventBus.getDefault().unregister(this); 在activity销毁的时候反注册。为什么要有反注册呢,因为一点注册了订阅,如果不及时的销毁,这个activity就会一直持有这个事件的引用,会导致内存泄露,所以在不需要的时候一定要注意反注册。
3.有了注册和反注册就肯定会有事件处理函数,这里会有四个拱大家选择。
A:onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
B:onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
C:onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么 onEventBackground函数直接在该子线程中执行。
D:onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

第二步:定义订阅事件类
使用EventBus作为订阅事件总线的话,它所订阅的是一个类,这个类会包含所订阅事件所需要的信息。

public class FirstEvent {    private String msg;    public FirstEvent(String msg){        this.msg=msg;    }    public String getMsg(){        return msg;    }}

第三步:发布者发布事件

 EventBus.getDefault().post(                        new FirstEvent("FirstEvent btn clicked"));

第四步:处理订阅事件

@Subscribe    public void onEventMainThread(FirstEvent event){        Toast.makeText(MainActivity.this,event.getMsg(),Toast.LENGTH_LONG).show();    }

第五步:注意
有很多同学在使用的时候都会忘记一个事情,注册和反注册也做了,但是为什么订阅事件的四个函数不会有自动提示呢,OK,我自己写还不行吗。但是又有问题了,参照代码写了一怎么看它也不会回调这四个函数中的其中一个阿。这里同学们一定要注意拉,所谓的发布订阅模式,就必须要有订阅,而订阅就少不了@Subscribe这个声明, 我看过很多的文章都没有注意这个点,在介绍的时候老是把@Subscribe这个声明给忽略掉,导致很多同学都感觉代码完全没有问题阿,为什么就是不行呢,所以细节很重要阿。

好了,说了那么多,现在开始上完整的代码。
第一个:主Activity,订阅处理

public class MainActivity extends ActionBarActivity {    private Button btn_move;    @Bind(R.id.btn_qq_login)    Button btn_qq_login;    @Bind(R.id.btn_weixin_login)    Button btn_weixin_login;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        EventBus.getDefault().register(this);//这个就是注册EventBus        ButterKnife.bind(this);        ShareSDK.initSDK(this);        btn_move= (Button) findViewById(R.id.btn_move);        btn_move.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent=new Intent(MainActivity.this, TwoActivity.class);                startActivity(intent);            }        });    }    //订阅事件处理函数    //FirstEvent 这个类就是我们要订阅的类信息,是完全自定义的,需要什么参数就写在里面,发布者发布事件              的时候就是通过它来发布的,订阅者就是根据它来获取发布者发布的信息的    @Subscribe    public void onEventMainThread(FirstEvent event){        Toast.makeText(MainActivity.this,event.getMsg(),Toast.LENGTH_LONG).show();    }    @Override    protected void onDestroy() {        super.onDestroy();        EventBus.getDefault().unregister(this);//反注册EventBus    }}

第二个:事件发布Activity
public class TwoActivity extends ActionBarActivity {
private Button btn_return;
private ImageView img_view;
private int drawableRes=R.mipmap.ic_launcher;

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_two);    btn_return= (Button) findViewById(R.id.btn_return);    img_view= (ImageView) findViewById(R.id.img_view);    btn_return.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View view) {            EventBus.getDefault().post(                    new FirstEvent("FirstEvent btn clicked"));//看到没,这个事件发布函数这个通过这个类把信息发布出去的。                }            }}

}

本人才疏学浅,讲得不好的地方请大家指正,学无止境,一起学习。

0 0
原创粉丝点击