Android EventBus简单介绍(一)

EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

作为一个消息总线,有三个主要的元素:

Event:事件(可以是任意对象,参考其他博客中都写成xxxEvent,不过我测试了一个任意名字的对象也可以,不知道如果应用中这么写会不会不规范?)

Subscriber:事件订阅者,接收特定的事件(这里常用的是当前的Activity或者Fragment的上下文)

Publisher:事件发布者,用于通知Subscriber有事件发生


简单使用:

1、定义事件类型:public class MyEvent {}`(就上面任意名称的那个对象,也是我们以后事件处理函数中唯一的传参对象)

2、注册订阅者:EventBus.getDefault().register(this)(this代表订阅者Subscriber,以后还会出现很多和这个单词很像的对象)

3、定义事件处理方法:public void onEventMainThread(这个起名以前是有讲究的,也非常古板,差不多等同四书五经了,现在好了很多,改革开放

4、发送事件:EventBus.getDefault().post(new MyEvent())(执行之前定义的事件处理方法的语句)


如果不看吐槽语,第一遍看这四个使用步骤,我是懵逼的,完全体会不到简单,所以,先放弃这个笼统的概念和“”晦涩“”的源码,先跑个简单的demo试试~


实现的内容是这样的,创建两个Activity,一个A一个B,然后我们通过A跳转到B,然后让B发送一个信息给A,简单来说就是Activity之间的信息传递,如果按照以前,可能会写个广播,可能会使用intent传参,不过EventBus可以让生活变得简单起来~(~ ̄▽ ̄)~

示意图:

第一个界面跳转第二个界面

第一个界面响应UI修改


首先创建一个需要传递的自定的FirstEvent,当然你可以叫别的。

FirstEvent.java

public class FirstEvent {
    private String msg;

    public FirstEvent(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }
}

然后是响应的Activity,也是订阅者MainActivity.java

我们需要在MainActivity把自己注册成订阅者,并且完成SecondActivity会调用的事件处理函数,不然SecondActivity调他干什么~

MainActivity.java

public class MainActivity extends Activity {

    Button btn;
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EventBus.getDefault().register(this);

        btn = (Button) findViewById(R.id.btn_try);
        tv = (TextView) findViewById(R.id.tv);        

        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(getApplicationContext(),
                        SecondActivity.class);
                startActivity(intent);
            }
        });
    }

   @Subscribe(threadMode = ThreadMode.Main)
    public void onEventMainThread(FirstEvent event) {
        String msg = "onEventMainThread收到了消息:" + event.getMsg();
        Log.d("harvic", msg);
        tv.setText(msg);
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }    

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

可以注意到,上面的代码中,除了常规的处理以为,我们使用EventBus.getDefault().register(this)注册了当前对象为订阅者,然后相对应的,要在onDestory中解除注册,毕竟EventBus是单例模型,要避免内存泄漏啊。

最后实现了一个叫onEventMainThread的方法,传入我们之前自定义的event,做了一些ui上的处理,这里的处理是设置一个TextView的内容。

这里的函数名起名以前是有讲究的,必须以onEvent开头,后面的界面也是固定的,代表着处理缩在的线程,一共有四种类型,这里的类型代表UI线程。现在可以随意。还有就是函数上面的@SubScribe标签,必须要写,否则程序就跪了。(3.0.0jar包运行结果)。

那么SecondActivity.java是如何发布事件的呢?

SecondActivity.java

public class SecondActivity extends Activity {
    private Button btn_FirstEvent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);

        btn_FirstEvent.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {                
                EventBus.getDefault().post(
                        new FirstEvent("FirstEvent btn clicked"));
            }
        });
    }
}

SecondActivity通过EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"))来发布一个事件,从而才能调用MainActivity的处理函数。

整个过程非常的清楚明了,而且没有什么代码冗余,很值得学习一下有木有~(o゜▽゜)o☆[BINGO!]

那么更加详细的流程是怎么样的,这就需要看看源码了,哎╮(╯▽╰)╭



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值