EventBus使用详解(二)——EventBus使用进阶

来源:互联网 发布:java认证考试一年几次 编辑:程序博客网 时间:2024/06/03 23:42
转载自:http://blog.csdn.net/harvic880925/article/details/40787203

一、概述

前一篇给大家装简单演示了EventBus的onEventMainThread()函数的接收,其实EventBus还有另外有个不同的函数,他们分别是:

1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync

这四种订阅函数都是使用onEvent开头的,它们的功能稍有不同,在介绍不同之前先介绍两个概念:
告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。

onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

二、实战

1、解析

上面列出的这四个函数,关键问题在于,我们怎么指定调用哪个函数呢?

我们先研究一下,上一篇中是怎么调用的onEventMainThread函数,除了在接收端注册与反注册以后,关键问题在于新建的一个类:

新建一个类:

[java] view plain copy
print?
  1. package com.harvic.other;  
  2.   
  3. public class FirstEvent {  
  4.   
  5.     private String mMsg;  
  6.     public FirstEvent(String msg) {  
  7.         // TODO Auto-generated constructor stub  
  8.         mMsg = msg;  
  9.     }  
  10.     public String getMsg(){  
  11.         return mMsg;  
  12.     }  
  13. }  
发送时:

[java] view plain copy
print?
  1. EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));    
接收时:
[java] view plain copy
print?
  1. public void onEventMainThread(FirstEvent event) {    
  2.   
  3.     ……  
  4. }    
发现什么问题了没?

没错,发送时发送的是这个类的实例,接收时参数就是这个类实例。

所以!!!!!!当发过来一个消息的时候,EventBus怎么知道要调哪个函数呢,就看哪个函数传进去的参数是这个类的实例,哪个是就调哪个。那如果有两个是呢,那两个都会被调用!!!!

为了证明这个问题,下面写个例子,先看下效果

2、实例

先看看我们要实现的效果:

这次我们在上一篇的基础上,新建三个类:FirstEvent、SecondEvent、ThirdEvent,在第二个Activity中发送请求,在MainActivity中接收这三个类的实例,接收时的代码为:

[java] view plain copy
print?
  1. public void onEventMainThread(FirstEvent event) {  
  2.   
  3.     Log.d("harvic""onEventMainThread收到了消息:" + event.getMsg());  
  4. }  
  5.   
  6. public void onEventMainThread(SecondEvent event) {  
  7.   
  8.     Log.d("harvic""onEventMainThread收到了消息:" + event.getMsg());  
  9. }  
  10.   
  11. public void onEvent(ThirdEvent event) {  
  12.     Log.d("harvic""OnEvent收到了消息:" + event.getMsg());  
  13. }  
使用两个onEventMainThread分别接收FirstEvent实例的消息和SecondEvent实例的消息,使用onEvent接收ThirdEvent实例的消息。界面操作及结果如下:


Log输出结果:


可以看到,在发送FirstEvent时,在MainActiviy中虽然有三个函数,但只有第一个onEventMainThread函数的接收参数是FirstEvent,所以会传到它这来接收。所以这里识别调用EventBus中四个函数中哪个函数,是通过参数中的实例来决定的。

因为我们是在上一篇例子的基础上完成的,所以这里的代码就不详细写了,只写改动的部分。

1、三个类

[java] view plain copy
print?
  1. package com.harvic.other;  
  2.   
  3. public class FirstEvent {  
  4.   
  5.     private String mMsg;  
  6.     public FirstEvent(String msg) {  
  7.         // TODO Auto-generated constructor stub  
  8.         mMsg = msg;  
  9.     }  
  10.     public String getMsg(){  
  11.         return mMsg;  
  12.     }  
  13. }  
[java] view plain copy
print?
  1. package com.harvic.other;  
  2.   
  3. public class SecondEvent{  
  4.   
  5.     private String mMsg;  
  6.     public SecondEvent(String msg) {  
  7.         // TODO Auto-generated constructor stub  
  8.         mMsg = "MainEvent:"+msg;  
  9.     }  
  10.     public String getMsg(){  
  11.         return mMsg;  
  12.     }  
  13. }  
[java] view plain copy
print?
  1. package com.harvic.other;  
  2.   
  3. public class ThirdEvent {  
  4.   
  5.     private String mMsg;  
  6.     public ThirdEvent(String msg) {  
  7.         // TODO Auto-generated constructor stub  
  8.         mMsg = msg;  
  9.     }  
  10.     public String getMsg(){  
  11.         return mMsg;  
  12.     }  
  13. }  

2、发送

然后在SecondActivity中新建三个按钮,分别发送不同的类的实例,代码如下:

[java] view plain copy
print?
  1. package com.harvic.tryeventbus2;  
  2.   
  3. import com.harvic.other.FirstEvent;  
  4. import com.harvic.other.SecondEvent;  
  5. import com.harvic.other.ThirdEvent;  
  6.   
  7. import de.greenrobot.event.EventBus;  
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.widget.Button;  
  12.   
  13. public class SecondActivity extends Activity {  
  14.     private Button btn_FirstEvent, btn_SecondEvent, btn_ThirdEvent;  
  15.   
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_second);  
  20.         btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);  
  21.         btn_SecondEvent = (Button) findViewById(R.id.btn_second_event);  
  22.         btn_ThirdEvent = (Button) findViewById(R.id.btn_third_event);  
  23.   
  24.         btn_FirstEvent.setOnClickListener(new View.OnClickListener() {  
  25.   
  26.             @Override  
  27.             public void onClick(View v) {  
  28.                 // TODO Auto-generated method stub  
  29.                 EventBus.getDefault().post(  
  30.                         new FirstEvent("FirstEvent btn clicked"));  
  31.             }  
  32.         });  
  33.           
  34.         btn_SecondEvent.setOnClickListener(new View.OnClickListener() {  
  35.   
  36.             @Override  
  37.             public void onClick(View v) {  
  38.                 // TODO Auto-generated method stub  
  39.                 EventBus.getDefault().post(  
  40.                         new SecondEvent("SecondEvent btn clicked"));  
  41.             }  
  42.         });  
  43.   
  44.         btn_ThirdEvent.setOnClickListener(new View.OnClickListener() {  
  45.   
  46.             @Override  
  47.             public void onClick(View v) {  
  48.                 // TODO Auto-generated method stub  
  49.                 EventBus.getDefault().post(  
  50.                         new ThirdEvent("ThirdEvent btn clicked"));  
  51.   
  52.             }  
  53.         });  
  54.   
  55.     }  
  56.   
  57. }  

3、接收

在MainActivity中,除了注册与注册,我们利用onEventMainThread(FirstEvent event)来接收来自FirstEvent的消息,使用onEventMainThread(SecondEvent event)接收来自SecondEvent 实例的消息,使用onEvent(ThirdEvent event) 来接收ThirdEvent 实例的消息。

[java] view plain copy
print?
  1. package com.harvic.tryeventbus2;  
  2.   
  3. import com.harvic.other.FirstEvent;  
  4. import com.harvic.other.SecondEvent;  
  5. import com.harvic.other.ThirdEvent;  
  6.   
  7. import de.greenrobot.event.EventBus;  
  8. import android.app.Activity;  
  9. import android.content.Intent;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12. import android.view.Menu;  
  13. import android.view.MenuItem;  
  14. import android.view.View;  
  15. import android.widget.Button;  
  16. import android.widget.TextView;  
  17.   
  18. public class MainActivity extends Activity {  
  19.   
  20.     Button btn;  
  21.     TextView tv;  
  22.     EventBus eventBus;  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.   
  29.         EventBus.getDefault().register(this);  
  30.   
  31.         btn = (Button) findViewById(R.id.btn_try);  
  32.   
  33.         btn.setOnClickListener(new View.OnClickListener() {  
  34.   
  35.             @Override  
  36.             public void onClick(View v) {  
  37.                 // TODO Auto-generated method stub  
  38.                 Intent intent = new Intent(getApplicationContext(),  
  39.                         SecondActivity.class);  
  40.                 startActivity(intent);  
  41.             }  
  42.         });  
  43.     }  
  44.   
  45.     public void onEventMainThread(FirstEvent event) {  
  46.   
  47.         Log.d("harvic""onEventMainThread收到了消息:" + event.getMsg());  
  48.     }  
  49.   
  50.     public void onEventMainThread(SecondEvent event) {  
  51.   
  52.         Log.d("harvic""onEventMainThread收到了消息:" + event.getMsg());  
  53.     }  
  54.   
  55.     public void onEvent(ThirdEvent event) {  
  56.         Log.d("harvic""OnEvent收到了消息:" + event.getMsg());  
  57.     }  
  58.   
  59.     @Override  
  60.     protected void onDestroy() {  
  61.         // TODO Auto-generated method stub  
  62.         super.onDestroy();  
  63.         EventBus.getDefault().unregister(this);  
  64.     }  
  65. }  
到这里,代码就结束 了,从上面的代码,我们可以看到,EventBus是怎么接收消息的,是根据参数中类的实例的类型的判定的,所以当如果我们在接收时,同一个类的实例参数有两个函数来接收会怎样?答案是,这两个函数都会执行,下面实验一下:

在MainActivity中接收时,我们在接收SecondEvent时,在上面onEventMainThread基础上另加一个onEventBackgroundThread和onEventAsync,即下面的代码:

[java] view plain copy
print?
  1. //SecondEvent接收函数一  
  2. public void onEventMainThread(SecondEvent event) {  
  3.   
  4.     Log.d("harvic""onEventMainThread收到了消息:" + event.getMsg());  
  5. }  
  6. //SecondEvent接收函数二  
  7. public void onEventBackgroundThread(SecondEvent event){  
  8.     Log.d("harvic""onEventBackground收到了消息:" + event.getMsg());  
  9. }  
  10. //SecondEvent接收函数三  
  11. public void onEventAsync(SecondEvent event){  
  12.     Log.d("harvic""onEventAsync收到了消息:" + event.getMsg());  
  13. }  

完整的代码在这里:

[java] view plain copy
print?
  1. package com.harvic.tryeventbus2;  
  2.   
  3. import com.harvic.other.FirstEvent;  
  4. import com.harvic.other.SecondEvent;  
  5. import com.harvic.other.ThirdEvent;  
  6.   
  7. import de.greenrobot.event.EventBus;  
  8. import android.app.Activity;  
  9. import android.content.Intent;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12. import android.view.Menu;  
  13. import android.view.MenuItem;  
  14. import android.view.View;  
  15. import android.widget.Button;  
  16. import android.widget.TextView;  
  17.   
  18. public class MainActivity extends Activity {  
  19.   
  20.     Button btn;  
  21.     TextView tv;  
  22.     EventBus eventBus;  
  23.   
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.   
  29.         EventBus.getDefault().register(this);  
  30.   
  31.         btn = (Button) findViewById(R.id.btn_try);  
  32.   
  33.         btn.setOnClickListener(new View.OnClickListener() {  
  34.   
  35.             @Override  
  36.             public void onClick(View v) {  
  37.                 // TODO Auto-generated method stub  
  38.                 Intent intent = new Intent(getApplicationContext(),  
  39.                         SecondActivity.class);  
  40.                 startActivity(intent);  
  41.             }  
  42.         });  
  43.     }  
  44.   
  45.     public void onEventMainThread(FirstEvent event) {  
  46.   
  47.         Log.d("harvic""onEventMainThread收到了消息:" + event.getMsg());  
  48.     }  
  49.   
  50.     //SecondEvent接收函数一  
  51.     public void onEventMainThread(SecondEvent event) {  
  52.   
  53.         Log.d("harvic""onEventMainThread收到了消息:" + event.getMsg());  
  54.     }  
  55.     //SecondEvent接收函数二  
  56.     public void onEventBackgroundThread(SecondEvent event){  
  57.         Log.d("harvic""onEventBackground收到了消息:" + event.getMsg());  
  58.     }  
  59.     //SecondEvent接收函数三  
  60.     public void onEventAsync(SecondEvent event){  
  61.         Log.d("harvic""onEventAsync收到了消息:" + event.getMsg());  
  62.     }  
  63.   
  64.     public void onEvent(ThirdEvent event) {  
  65.         Log.d("harvic""OnEvent收到了消息:" + event.getMsg());  
  66.     }  
  67.   
  68.     @Override  
  69.     protected void onDestroy() {  
  70.         // TODO Auto-generated method stub  
  71.         super.onDestroy();  
  72.         EventBus.getDefault().unregister(this);  
  73.     }  
  74. }  
经过上面的分析,当发送SecondEvent实例的消息过来的时候,这三个函数会同时接收到并各自执行,所以当点击Second Event这个button的时候,会出现下面的结果:



好啦,这篇就到了,讲来讲去就是说一个问题:消息的接收是根据参数中的类名来决定执行哪一个的;


参考文章:

《Android解耦库EventBus的使用和源码分析》:http://blog.csdn.net/yuanzeyao/article/details/38174537

《EventBus的使用初试》:http://blog.csdn.net/pp_hdsny/article/details/14523561

《EventBusExplained 》:https://code.google.com/p/guava-libraries/wiki/EventBusExplained

《Google Guava EventBus实例与分析》


如果我的文章有帮到你,记得关注哦!

源码下载地址:http://download.csdn.net/detail/harvic880925/8128633

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/40787203   谢谢!




106
6
 
 

  相关文章推荐
  • EventBus使用详解(二)——EventBus使用进阶 2014-11-04 16:45 88833人阅读 评论(81) 收藏 举报 分类: 5、andriod开发(149) 版权声明:本文
  • (转)EventBus使用详解(二)——EventBus使用进阶
  • EventBus使用详解(二)——EventBus使用进阶
  • EventBus使用详解(二)——EventBus使用进阶
  • EventBus使用详解(二)——EventBus使用进阶
  • 《EventBus使用详解(二)——EventBus使用进阶》
  • EventBus使用详解(二)——EventBus使用进阶
  • 《EventBus使用详解(二)——EventBus使用进阶》
  • EventBus使用详解(二)——EventBus使用进阶
  • EventBus使用详解(二)——EventBus使用进阶
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 充错手机号码而且是空号怎么办 微信钱包充错话费怎么办 QQ充值话费充到空号了怎么办 给别人充错话费怎么办 用qq交错话费对方是空号怎么办 号码变成空号了怎么办 qq冲流量冲错了怎么办 流量冲错了套餐怎么办 微信流量充错号码怎么办 微信支付不进账怎么办 充话费充不进去怎么办 用支付宝充话费没到账怎么办 支付宝充话费未到账怎么办 话费充了不到账怎么办 转转买家不确认收货怎么办 充话费错了怎么办啊 淘宝充值流量没到账怎么办 微信手机充错了怎么办 支付宝充话费没到账怎么办 裤子摔了一个洞怎么办 顾客反应衣服质量不好怎么办 淘宝买的衣服味道很大怎么办 三国杀账号忘了怎么办 宽带连接被删了 怎么办 手机被偷了qq怎么办 手机丢了微信怎么办啊 手机店把手机修坏了怎么办 在手机店买到山寨机手机怎么办 有人在qq群上骂我怎么办 qq群一直有人骚扰怎么办 苹果手机QQ图标不在桌面上怎么办 苹果手机长按不能删除怎么办 qq发的图片过期怎么办 九黎八卦在仓库怎么办 飞猪f2领了万豪银卡没住怎么办 机械键盘摁键冲突怎么办 玩游戏键盘没反应怎么办 玩枪战游戏头晕恶心怎么办 手机看视频不能横屏怎么办 苹果手机安全码忘记了怎么办 信用卡安全码忘记了怎么办