eventBus的入门

    很早之前就有童鞋告诉我这个开源框架了,一直想看,因为各种原因都没有去看,现在终于看了。
    好开心,写个总结来瞅瞅。首先就是依赖了,只有关联了你才能用。代码如下
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);//注册eventBus
        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
    }
    至此,前面全都写完之后,重要的来了,那就是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"的方法是重载的,会不会有问题,告诉你,没问题。前面我也说过了,判断调用那个接收方法,或者说接收方法接收哪条数据,是根据参数类型来的。跟方法名无关。差不多久这样吧。

项目链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海晨忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值