EventBus3.0使用总结

举报
江南一点雨 发表于 2021/08/16 22:49:17 2021/08/16
【摘要】 在Android中,接口回调已经能够处理掉大部分业务需求了,实在太变态的需求就用广播也能够完成,自己写的性能好出问题也好解决。。。。。工作需要,不得不看看EventBus的用法,今天就来介绍一下学习经验。 首先就是引入这个东东,我是直接在maven上下载的jar包,下载地址:http://search.maven.org/#search|ga|1|g%3A%22de.gree...

在Android中,接口回调已经能够处理掉大部分业务需求了,实在太变态的需求就用广播也能够完成,自己写的性能好出问题也好解决。。。。。工作需要,不得不看看EventBus的用法,今天就来介绍一下学习经验。

首先就是引入这个东东,我是直接在maven上下载的jar包,下载地址:
http://search.maven.org/#search|ga|1|g%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22

下载完成之后,拷贝到我们的项目之中就可以使用了。

1.注册事件订阅者

使用EventBus我们首先要注册事件订阅者,这个事件订阅者就是说我们订阅的事件一会要在哪里进行处理,事件订阅者的注册和广播注册非常相似,有注册,也有解除注册,一般情况下,我们在Activity的onCreate()方法中进行注册,在Activity的onDestory()方法中解除注册。OK,代码如下:

注册:

EventBus.getDefault().register(this);
 

EventBus.getDefault().unregister(this);
 


  
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. EventBus.getDefault().register(this);
  6. }
  7. @Override
  8. protected void onDestroy() {
  9. super.onDestroy();
  10. EventBus.getDefault().unregister(this);
  11. }

2.构造发送消息类

注册号事件订阅者之后,第二步就是构造发送消息类,这个类就是我们要发送的对象,所以这个类怎么写都行,只要你把要传递的东西能够存进这个对象中又能够从这个对象中拿出来就好。OK,我写了一个简单的消息类,如下:


  
  1. public class MainMessage {
  2. private String msg;
  3. public MainMessage(String msg) {
  4. this.msg = msg;
  5. }
  6. public String getMsg() {
  7. return msg;
  8. }
  9. }

3.发送消息

下来就是发送消息,发送消息也很简单,代码如下:

EventBus.getDefault().post(new MainMessage("Hello EventBus"));
 

4.消息接收

最后一步,就是消息的接收,看看我们是怎么接收消息的:


  
  1. //主线程中执行
  2. @Subscribe(threadMode = ThreadMode.MainThread)
  3. public void onMainEventBus(MainMessage msg) {
  4. Log.d(TAG, "onEventBus() returned: " + Thread.currentThread());
  5. }
threadMode = ThreadMode.MainThread,这个又表示什么意思呢?这个表示我们的这个方法在主线程中执行,除了在主线程中执行之外,还能在哪里执行呢?看下面三个方法:

   
  1. //后台线程
  2. @Subscribe(threadMode = ThreadMode.BackgroundThread)
  3. public void onBackgroundEventBus(BackgroundMessage msg) {
  4. Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread());
  5. }
  6. //强制后台执行
  7. @Subscribe(threadMode = ThreadMode.Async)
  8. public void onAsyncEventBus(AsyncMessage msg) {
  9. Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread());
  10. }
  11. //默认情况,和发送事件在同一个线程
  12. @Subscribe(threadMode = ThreadMode.PostThread)
  13. public void onPostEventBus(PostMessage msg) {
  14. Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread());
  15. }

ThreadMode.BackgroundThread表示让该方法在后台执行,ThreadMode.Async也表示在后台执行,不同的是这里表示消息发送方不必等待后台线程完就可以接着往下执行。最后一个ThreadMode.PostThread表示该方法和消息发送方在同一个线程中执行。
那么针对这种不同类型的方法,我分别打印了日志,如下:


很简单吧。
好了,最后放出完整的代码,如下:


  
  1. public class MainActivity extends AppCompatActivity {
  2. private TextView tv;
  3. private final static String TAG = "EventBusTest";
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. tv = ((TextView) findViewById(R.id.tv));
  9. EventBus.getDefault().register(this);
  10. }
  11. @Override
  12. protected void onDestroy() {
  13. super.onDestroy();
  14. EventBus.getDefault().unregister(this);
  15. }
  16. public void btnClick(View view) {
  17. switch (view.getId()) {
  18. case R.id.btn1:
  19. EventBus.getDefault().post(new MainMessage("Hello EventBus"));
  20. break;
  21. case R.id.btn2:
  22. EventBus.getDefault().post(new BackgroundMessage("Hello EventBus"));
  23. break;
  24. case R.id.btn3:
  25. EventBus.getDefault().post(new AsyncMessage("Hello EventBus"));
  26. break;
  27. case R.id.btn4:
  28. EventBus.getDefault().post(new PostMessage("Hello EventBus"));
  29. break;
  30. }
  31. }
  32. //主线程中执行
  33. @Subscribe(threadMode = ThreadMode.MainThread)
  34. public void onMainEventBus(MainMessage msg) {
  35. tv.setText(msg.getMsg());
  36. Log.d(TAG, "onEventBus() returned: " + Thread.currentThread());
  37. }
  38. //后台线程
  39. @Subscribe(threadMode = ThreadMode.BackgroundThread)
  40. public void onBackgroundEventBus(BackgroundMessage msg) {
  41. Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread());
  42. }
  43. //强制后台执行
  44. @Subscribe(threadMode = ThreadMode.Async)
  45. public void onAsyncEventBus(AsyncMessage msg) {
  46. Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread());
  47. }
  48. //默认情况,和发送事件在同一个线程
  49. @Subscribe(threadMode = ThreadMode.PostThread)
  50. public void onPostEventBus(PostMessage msg) {
  51. Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread());
  52. }
  53. }


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical">
  8. <Button
  9. android:id="@+id/btn1"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:onClick="btnClick"
  13. android:text="发送消息到主线程执行"/>
  14. <Button
  15. android:id="@+id/btn2"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:onClick="btnClick"
  19. android:text="发送消息到后台线程执行"/>
  20. <Button
  21. android:id="@+id/btn3"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:onClick="btnClick"
  25. android:text="发送消息到后台线程强制执行"/>
  26. <Button
  27. android:id="@+id/btn4"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:onClick="btnClick"
  31. android:text="发送消息--和发送方同一线程执行"/>
  32. <TextView
  33. android:id="@+id/tv"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:text="Hello World!"/>
  37. </LinearLayout>

就这些。


文章来源: wangsong.blog.csdn.net,作者:_江南一点雨,版权归原作者所有,如需转载,请联系作者。

原文链接:wangsong.blog.csdn.net/article/details/50688236

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。