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"));//看到没,这个事件发布函数这个通过这个类把信息发布出去的。 } }}
}
本人才疏学浅,讲得不好的地方请大家指正,学无止境,一起学习。
- EventBus 《二》 Android EventBus的简单使用
- EventBus的使用初试
- EventBus的使用
- EventBus的使用
- EventBus的简单使用
- EventBus的使用
- eventbus的使用
- EventBus的初步使用:
- EventBus的使用
- EventBus的简单使用
- EventBus的使用总结
- EventBus的使用
- EventBus框架的使用
- EventBus的简单使用
- Eventbus的基本使用
- EventBus的使用
- EventBus的使用
- EventBus的简单使用
- Centos7 VMware 挂载SD卡
- mtd-utils交叉编译
- c++11标准下的随机数发生器
- 关于C++调用C#语言DLL(类库)
- TCP 回射程序(处理子进程的SIGCHLD信号)
- EventBus的使用
- 寻找sql注入的网站的方法
- PowerPC在信号处理中的应用
- ThreadLocal与Synchronized的使用
- Swift下多个Storyboard的项目结构
- 【24.58%】【BZOJ 1001】狼抓兔子
- 【JAVA基础】net.sf.json.JSONObject 和org.json.JSONObject 的差别
- 使用dd命令测试磁盘读写性能
- level 配合substr 和instr 进行字符串截取