android|EventBus使用详解

当我在处理fragment间通信问题时,尤其在viewpager中嵌套各种fragment时,各个fragment间数据通信,常常让我脑疼o(╥﹏╥)o,多线程比如下载后的通知显示等,虽然可以用AsyncTask,Handler解决,但还有一种方法,使用今天的主角EventBus。使用很简单,常用语组件之间的通信吧。
首先给github地址:https://github.com/greenrobot/EventBus
看看官网咋介绍的:
android|EventBus使用详解
文章图片


流程
先简单看看流程图:
【android|EventBus使用详解】android|EventBus使用详解
文章图片

事件发送者,即publisher通过post方法发送事件event给EventBus,EventBus在转发给全部的SubcScriber,如果监听事件中参数event与发送的event类型是一样的,则响应此次事件。有一些类似神经,当手臂皮肤(事件发送者)接触到火焰,发送刺激神经信号,神经(event)传递到中枢神经或者在传递到大脑(EventBus),由中枢神经或大脑发送反馈给各部位,比如让人感觉疼了,并缩手(观察的响事件)。
总结下,参与这个表演的有三个:
1.publisher(商家,事件发布者)发送事件的。
2.event(快递,事件),这里事件是POJO(Plain Ordinary Java Object,POJO根据百度百科解释:简单的javaBean对象,一些属性以及get和set方法),绝对不可以有业务逻辑的方法!
android|EventBus使用详解
文章图片

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线程,事件总是先入队,后交付给用户。事件处理严格按串行顺序。
除了设置运行线程外,还可以设置线程的优先级.
android|EventBus使用详解
文章图片



优点
官网是这么夸自己的:
EventBus……
简化组件之间的通信
解耦事件发送方和接收方
能够很好地处理活动、片段和后台线程
避免复杂和容易出错的依赖关系和生命周期问题
使代码更简单

很小(~50k罐)
在实践中是否被安装超过1亿次的应用程序所证明
具有高级特性,如交付线程、订阅者优先级等。
简单使用后,我发现,确实很简单,比handler,AsyncTask,广播什么的,都简单的多了。
步骤
1.引入;
implementation 'org.greenrobot:eventbus:3.1.1'

2.编写事件
/** * create time on2019/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); }}

这就完成了~

    推荐阅读