EventBus3.0 在Android上的使用

来源:互联网 发布:js基本语法 编辑:程序博客网 时间:2024/06/04 10:56

一、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
原创粉丝点击