EventBus使用详解

当我在处理fragment间通信问题时,尤其在viewpager中嵌套各种fragment时,各个fragment间数据通信,常常让我脑疼             o(╥﹏╥)o,多线程比如下载后的通知显示等,虽然可以用AsyncTask,Handler解决,但还有一种方法,使用今天的主角EventBus。使用很简单,常用语组件之间的通信吧。

首先给github地址:https://github.com/greenrobot/EventBus

看看官网咋介绍的:

 

流程

先简单看看流程图:

 事件发送者,即publisher通过post方法发送事件event给EventBus,EventBus在转发给全部的SubcScriber,如果监听事件中参数event与发送的event类型是一样的,则响应此次事件。有一些类似神经,当手臂皮肤(事件发送者)接触到火焰,发送刺激神经信号,神经(event)传递到中枢神经或者在传递到大脑(EventBus),由中枢神经或大脑发送反馈给各部位,比如让人感觉疼了,并缩手(观察的响事件)。

总结下,参与这个表演的有三个:

1.publisher(商家,事件发布者)发送事件的。

2.event(快递,事件),这里事件是POJO(Plain Ordinary Java Object,POJO根据百度百科解释:简单的javaBean对象,一些属性以及get和set方法),绝对不可以有业务逻辑的方法!

3.Subscriber(买家,事件的响应者)写一个方法,在上面标注@subscribe 即可。但是,必须要在类中有注册以及取消注册,官网放在onStart和onStop方法中,我并不喜欢这么做,因为当我在MainActivity注册后,跳转SecondActivity去,在SecondActivity中修改MainActivityde的部分内容时,由于页面跳转,MainActivity生命周期会在SecondActivity执行onResume后,执行onStop方法,注意,官网在opStop方法中取消注册了,那不就gg了?所以我实在onCreate方法和在onDestroy方法中注册的。

在@Subscribe后可以添加括号,在括号内设置执行的线程,主要有以下几种

  • POSTING:默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。
  • MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
  • BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
  • MAIN_ORDERED:事件处理函数在ui线程,事件总是先入队,后交付给用户。事件处理严格按串行顺序。

除了设置运行线程外,还可以设置线程的优先级.


 

优点

官网是这么夸自己的:

EventBus……

简化组件之间的通信

解耦事件发送方和接收方

能够很好地处理活动、片段和后台线程

避免复杂和容易出错的依赖关系和生命周期问题

使代码更简单

很小(~50k罐)

在实践中是否被安装超过1亿次的应用程序所证明

具有高级特性,如交付线程、订阅者优先级等。

简单使用后,我发现,确实很简单,比handler,AsyncTask,广播什么的,都简单的多了。

步骤

1.引入;

implementation 'org.greenrobot:eventbus:3.1.1'

2.编写事件

/**
 * create time on  2019/3/20
 * function: 事件1
 */
public class MessageOneEvent {
    private String message;

    public String getMessage() {
        return message;
    }

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

3.编写subscribers,事件发送者

这里我在SecondActivity中有一个btn按钮,点击按钮改变MainActivity中textView的显示内容:

/**
     * btn点击事件
     * @param view
     */
    public void changeTextMain(View view) {
        MessageOneEvent messageOneEvent = new MessageOneEvent();
        messageOneEvent.setMessage("SecondActivity change");
        EventBus.getDefault().post(messageOneEvent);
        finish();
    }

4.编写事件响应者。记得注册和解除注册

public class MainActivity extends AppCompatActivity {

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

        //注册
        EventBus.getDefault().register(this);

        textView = findViewById(R.id.tv_Main);

        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });

    }


    /**
     * 响应者
     * @param message
     */
    @Subscribe(threadMode = ThreadMode.MAIN_ORDERED,priority = 2)

    public void onMessageEvent(MessageOneEvent message){
        textView.setText(message.getMessage());

    }

    /**
     * 解除注册
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

}

这就完成了~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值