前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EventBus简介及初步使用

EventBus简介及初步使用

作者头像
用户1108631
发布2019-08-17 13:15:12
5670
发布2019-08-17 13:15:12
举报

EventBus简介

EventBus是一个Android和Java的发布/订阅事件总线模型,其模型图如下所示:

EventBus的优点有:

  1. 简化组件之间的通信
  2. 简化代码
  3. 快速,小巧(~50K jar)
  4. 具有线程分发、订阅优先级等高级特性

从模型图中可以看到几个概念:

  1. Publisher:发布者,发布事件,事件的产生者
  2. Event:事件,封装了要传递的内容
  3. Subscriber:订阅者,对事件感兴趣的消费者
  4. EventBus:事件总线,管家,将事件分发给正确的Subscriber进行处理

初步使用

在Android中考虑一个场景,Activity A需要显示一个从网站上下载的内容,该下载任务在Activity B中进行,完成后,将内容通知给Activity A进行显示。

不使用EventBus的情况

不使用EventBus的情况下,Activity A使用startActivityForResult请求Activity B,Activity中开启线程进行网络任务,完成后将结果通过setResult返回。 Actiivty A的代码如下:

代码语言:javascript
复制
private TextView showContentTv;

public void downloadPage(View view) {
        startActivityForResult(new Intent(this,SecondActivity.class),0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        showContentTv.setText(data.getStringExtra("content"));
    }

Activity B的代码如下:

代码语言:javascript
复制
private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what==1){
                Intent intent=getIntent();
                intent.putExtra("content","Hello World From Network");
                setResult(0,intent);
                finish();
            }
        }
    };

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

        new Thread(new Runnable() {
            @Override
            public void run() {

                //模拟网络任务
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.sendEmptyMessage(1);

            }
        }).start();

    }
使用EventBus的情况

EventBus的基本使用包含三个步骤:

  1. 定义事件 例子中下载内容就是一个String类型的字符串,可以简单定义:
代码语言:javascript
复制
public class MessageEvent {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
  1. 准备订阅者 由于上面例子中Activity A是要显示Activity B下载的内容,因此Activity A是事件的消费者,在其中声明一个方法如下:
代码语言:javascript
复制
@Subscribe(threadMode = ThreadMode.MAIN)
    public void showContent(MessageEvent messageEvent){
        showContentTv.setText(messageEvent.getMessage());
    }

另外,还需要将Subscriber注册到EventBus中,这个需要在Activity的生命周期方法中进行注册,如下:

代码语言:javascript
复制
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showContentTv=findViewById(R.id.showContentTv);
        EventBus.getDefault().register(this);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
  1. 发布者发布事件 Activity B完成下载后,需要将内容打包成Event,然后发送出去,
代码语言:javascript
复制
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        new Thread(new Runnable() {
            @Override
            public void run() {

                //模拟网络任务
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                MessageEvent messageEvent=new MessageEvent();
                messageEvent.setMessage("Hello World From Network");
                EventBus.getDefault().post(messageEvent);
                finish();

            }
        }).start();
    }

总结

经过两种方式的对比,可以看到接入EventBus是一件很简单的事情,并且EventBus可以带来很好的解耦性。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学点Android知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • EventBus简介
  • 初步使用
    • 不使用EventBus的情况
      • 使用EventBus的情况
      • 总结
      相关产品与服务
      事件总线
      腾讯云事件总线(EventBridge)是一款安全,稳定,高效的云上事件连接器,作为流数据和事件的自动收集、处理、分发管道,通过可视化的配置,实现事件源(例如:Kafka,审计,数据库等)和目标对象(例如:CLS,SCF等)的快速连接,当前 EventBridge 已接入 100+ 云上服务,助力分布式事件驱动架构的快速构建。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档