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同时执行时的异步问题,事件的传递也没有序列化与反序列化的性能消耗,足以满足我们大部分情况下的模块间通信需求。
这篇只是知其然,却不知其所以然,要想知其所以然就得深入源码去了解了。
- EventBus3.0 在Android上的使用
- Android中EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- EventBus3.0的使用
- 【Android】- EventBus3.0使用详解
- Android-EventBus3.0的使用简单使用记录
- EventBus3.0的基础使用。
- EventBus3.0的初次使用
- EventBus3.0的简单使用
- 防止表单重复递交
- ECMAScript 6入门 学习笔记
- Java synchronized详解
- Oracle 11g Release2 安装图文教程 for windows
- spring MVC接收请求体总是多一个等号
- EventBus3.0 在Android上的使用
- BaseRecyclerViewAdapterHelper之BaseSectionQuickAdapter实现分组功能
- 【洛谷 3371】【模板】单源最短路径
- 厦门某公司图像处理工程师面试
- [LeetCode]313. Super Ugly Number
- 使用Android的OpenGL编写视频播放器
- 机器学习基础(入门篇)
- 正则表达式的使用
- node中使用promise解决异步问题