EventBus简介以及初步使用

EventBus简介

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

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的代码如下:

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的代码如下:

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类型的字符串,可以简单定义:

public class MessageEvent {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2、准备订阅者
由于上面例子中Activity A是要显示Activity B下载的内容,因此Activity A是事件的消费者,在其中声明一个方法如下:

@Subscribe(threadMode = ThreadMode.MAIN)
    public void showContent(MessageEvent messageEvent){
        showContentTv.setText(messageEvent.getMessage());
    }

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

@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);
    }

3、发布者发布事件
Activity B完成下载后,需要将内容打包成Event,然后发送出去,

 @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可以带来很好的解耦性。

猜你喜欢

转载自blog.csdn.net/qq_19431333/article/details/80976445