EventBus3.0 在Android上的使用

一、EventBus3.0的基本简介:

以前Android组件之间都是用Intent或者Broadcast来进行通信的。而EventBus则大大简化了应用程序内各组件间、组件与后台线程间的通信

ThreadMode:这是个枚举,有四个值,决定订阅函数在哪个线程执行
PostThread:事件发送者在哪个线程就执行在哪个线程。默认值就是这个
MainThread:订阅函数一定执行在主线程。同onEventMainThread方法
BackgroundThread:如果是事件从子线程发出,订阅函数就执行在那个子线程,不会创建新的子线程;如果主线程发出事件,则创建子线程。同onEventBackgroundThread方法
Async:一定创建子线程。同onEventAsync方法。

sticky:默认为false,如果为true,当通过postSticky发送一个事件时,这个类型的事件的最后一次事件会被缓存起来,当有订阅者注册时,会把之前缓存起来的这个事件直接发送给它。使用在比如事件发送者先启动了,订阅者还没启动的情况。

priority:默认值为0。订阅了同一个事件的订阅函数,在ThreadMode值相同的前提下,收到事件的优先级。

二、实战操作

当然首先要进行环境配置:
在build.gradle配置如下

project下的:
  buildscript {
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

app下的:
apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'org.greenrobot:eventbus:3.0.0'
    apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}

//这个是优化编译速度的,可选项
apt {
    arguments {
        eventBusIndex "com.whoislcj.eventbus.MyEventBusIndex"
    }
}

先来看一下效果图

post发送

这里写图片描述

postSticky发送

这里写图片描述

     从效果图中可以看出,使用post发送事件,除了自身能收到信息外,SecondActivity收不到MainActivity发送的信息。这是因为post的时候SecondActivity还没注册事件,自然收不到任何信息。使用postSticky发送事件,MainActivity和SecondActivity都能收到发送的信息。
     综上,可以看出post和postSticky的区别就是post就是直接发送事件,前提是你要在post之前,就已经注册了事件的。而postSticky则在发送的时候就已经缓存了事件,直到有注册sticky的事件发生时,他就会触发。不明白的话,再仔细看看代码。

注意:注册的时候要尽量在onCreate或者onStart方法上注册,取消注册则在onDestroy上。

代码示例:

public class MainActivity extends AppCompatActivity {
  TextView mTextView;
  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView= (TextView) findViewById(R.id.tv);
    EventBus.getDefault().register(this);
  }
  public void post(View view){
    EventBus.getDefault().post("在MainActivity使用post(直接发布)");
  }
  public void postSticky(View view){
    EventBus.getDefault().postSticky("在MainActivity使用postSticky(滞留发布)");
  }
  public void second(View view){
    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    startActivity(intent);
  }
 @Subscribe(threadMode = ThreadMode.MAIN)
  public void onEvent(String msg){
    mTextView.setText(msg);
  }

  @Override protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
  }
public class SecondActivity extends AppCompatActivity {

  private TextView mTextView;

  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    mTextView = (TextView) findViewById(R.id.show);
    EventBus.getDefault().register(this);
  }

  public void post(View view) {
    EventBus.getDefault().post("在SecondActivity使用post(直接发布)");
  }
  public void postSticky(View view) {
    EventBus.getDefault().postSticky("在SecondActivity使用postSticky(滞留发布)");
  }
  public void back(View view) {
    Intent intent = new Intent(SecondActivity.this,MainActivity.class);
    startActivity(intent);
  }
  @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
  public void onEvent(String msg){
    mTextView.setText(msg);
  }

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

三、总结
      为确保在SecondActivity中能收到消息。MainActivity和SecondActivity开启模式为 singleTask或者,singleInstancce,确保回去看到mainActivity为同一个实例。才能接收到消息。(其他人的demo回传消息的时候是通过finish把本身activity杀死了,直接回到了前面的MainActivity,还是保证是同一示例对象~~~)
我展示了在MainActivity上的操作,至于在SecondActivity上的操作也是一样的,自己去试试,有不足或有疑问的评论下方留言。
      在实际项目的使用中,register和unregister通常与Activity和Fragment的生命周期相关,ThreadMode.MainThread可以很好地解决Android的界面刷新必须在UI线程的问题,不需要再回调后用Handler中转(EventBus中已经自动用Handler做了处理),黏性事件可以很好地解决post与register同时执行时的异步问题,事件的传递也没有序列化与反序列化的性能消耗,足以满足我们大部分情况下的模块间通信需求。
      这篇只是知其然,却不知其所以然,要想知其所以然就得深入源码去了解了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值