很早之前就有童鞋告诉我这个开源框架了,一直想看,因为各种原因都没有去看,现在终于看了。
好开心,写个总结来瞅瞅。首先就是依赖了,只有关联了你才能用。代码如下
compile 'de.greenrobot:eventbus:3.0.0-beta1'
就这一行代码,在build.gradle文件的dependencies类下面,这是手动添加,你也可以在线自动添加依赖,如下
file—project structures—modules—dependencies—绿色的加号—library dependencies—搜索de.greenrobot:eventbus即可。
好了依赖弄好之后,你先在你的项目下面创建两个Activity1,Activity2。两个布局,
两个布局各放一个Button,TextView。然后,Activity1中的button的点击事件跳转到第二个
Activity2.就是常规写法,通过intent跳转。在onCreate方法里面注册eventBus,
在onDestroy方法里面解绑。这里要注意的是(敲黑板),写了注册,就一定要写解绑。
在哪里写了接收方法,就要在哪里写注册跟解绑,这两个是在一起的。
post可以在任意的位置。代码如下:
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity1_layout);
EventBus.getDefault().register(this );
btn1 = (Button) findViewById(R.id.btn_activity1);
tv1 = (TextView) findViewById(R.id.tv_activity1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View v) {
Intent intent = new Intent(Activity1.this , Activity2.class);
startActivity(intent);
}
});
}
@Override
protected void onDestroy () {
super .onDestroy();
EventBus.getDefault().unregister(this );
}
至此,前面全都写完之后,重要的来了,那就是eventBus的用法了,在第二个activity2的
button点击事件里写如下代码:
EventBus.getDefault ().post (new FirstEventBus("you are rubbish1" ))
就这么一行代码事件就发送了,就是通过eventBus默认的对象调用他的post方法即可。
那么,谁接收呢?你需要在哪个页面接收这个数据就在对应的activity中写对应的方法,
这里我们是在第一个activity1中接收的,如下代码:
@Subscribe(threadMode = ThreadMode.MainThread )
public void hello(FirstEventBus eventBus) {
tv1.setText (eventBus.getMsg ())
Toast.makeText (this, eventBus.getMsg (), Toast.LENGTH _LONG).show ()
}
就这么简单,这里记得标记不要漏了@Subscribe,括号里面的表示该方法在哪个线程中执行,
我们这里在主线程里面。更新UI,肯定是在UI线程中执行啊。就这样,基本使用就会了。这就是入门了。
我用的时候碰到过几个问题,注意如下几点:
1.问:post方法一次可以传几个对象呢?
答:eventBus可以多次调用post方法,但是不能一次传多个参数对象,因为eventBus这个开源框架post方法就只有一个参数对象。
2.问:如果多次调用post,接收方法怎么判断取哪个post方法传的值呢?或者说根据什么调用的?
答:接收方法是根据接受方法的参数类型调用的(3.0版本的eventBus),与方法名,在哪个线程执行无关。比方说:
EventBus.getDefault ().post (new FirstEventBus("you are rubbish1" ))
EventBus.getDefault ().post (new SecondEventBus("you are rubbish2" ))
EventBus.getDefault ().post (new ThirdEventBus("you are rubbish3" ))
我这里发送了三次post数据,如果你要取"you are rubbish1"这条数据,那么你就要先看这是个什么对象,我们看到这个对象是FirstEventBus。那么就创建对应的接收方法:
@Subscribe(threadMode = ThreadMode.MainThread )
public void hello(FirstEventBus eventBus) {
tv1.setText (eventBus.getMsg ())
Log.v ("wz" , "i=" + i)
i++
Toast.makeText (this, eventBus.getMsg (), Toast.LENGTH _LONG).show ()
}
@Subscribe(threadMode = ThreadMode.MainThread )
public void hello1223(FirstEventBus eventBus) {
tv1.setText (eventBus.getMsg ())
Log.v ("wz" , "i=" + i)
i++
Toast.makeText (this, eventBus.getMsg (), Toast.LENGTH _LONG).show ()
}
上面两个方法,虽然方法名不同。但是,方法的参数是同一个,那么两个方法都会接收到"you are rubbish1",这条数据。
如果你要接收"you are rubbish2"这条数据,这条数据对应的对象是SecondEventBus,那么你就创建如下方法:
@Subscribe(threadMode = ThreadMode.MainThread )
public void hello(SecondEventBus eventBus) {
tv1.setText (eventBus.getMsg ())
Log.v ("wz" , "i=" + i)
i++
Toast.makeText (this, eventBus.getMsg (), Toast.LENGTH _LONG).show ()
}
那么,又有人问了,你这个方法跟接收"you are rubbish1"的方法是重载的,会不会有问题,告诉你,没问题。前面我也说过了,判断调用那个接收方法,或者说接收方法接收哪条数据,是根据参数类型来的。跟方法名无关。差不多久这样吧。
项目链接