EventBus使用详解(二)

二、实战1、解析

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

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

新建一个类:

package com.harvic.other;public class FirstEvent {private String mMsg;public FirstEvent(String msg) {// TODO Auto-generated constructor stubmMsg = msg;}public String getMsg(){return mMsg;}}发送时:EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked")); 接收时: public void onEventMainThread(FirstEvent event) {……} 发现什么问题了没?

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

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

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

2、实例

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

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

public void onEventMainThread(FirstEvent event) {Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());}public void onEventMainThread(SecondEvent event) {Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());}public void onEvent(ThirdEvent event) {Log.d("harvic", "OnEvent收到了消息:" + event.getMsg());}使用两个onEventMainThread分别接收FirstEvent实例的消息和SecondEvent实例的消息,使用onEvent接收ThirdEvent实例的消息。界面操作及结果如下:

Log输出结果:

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

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

1、三个类package com.harvic.other;public class FirstEvent {private String mMsg;public FirstEvent(String msg) {// TODO Auto-generated constructor stubmMsg = msg;}public String getMsg(){return mMsg;}}package com.harvic.other;public class SecondEvent{private String mMsg;public SecondEvent(String msg) {// TODO Auto-generated constructor stubmMsg = "MainEvent:"+msg;}public String getMsg(){return mMsg;}}package com.harvic.other;public class ThirdEvent {private String mMsg;public ThirdEvent(String msg) {// TODO Auto-generated constructor stubmMsg = msg;}public String getMsg(){return mMsg;}}2、发送

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

package com.harvic.tryeventbus2;import com.harvic.other.FirstEvent;import com.harvic.other.SecondEvent;import com.harvic.other.ThirdEvent;import de.greenrobot.event.EventBus;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class SecondActivity extends Activity {private Button btn_FirstEvent, btn_SecondEvent, btn_ThirdEvent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);btn_FirstEvent = (Button) findViewById(R.id.btn_first_event);btn_SecondEvent = (Button) findViewById(R.id.btn_second_event);btn_ThirdEvent = (Button) findViewById(R.id.btn_third_event);btn_FirstEvent.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubEventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));}});btn_SecondEvent.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubEventBus.getDefault().post(new SecondEvent("SecondEvent btn clicked"));}});btn_ThirdEvent.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubEventBus.getDefault().post(new ThirdEvent("ThirdEvent btn clicked"));}});}}3、接收在MainActivity中,除了注册与注册,我们利用onEventMainThread(FirstEvent event)来接收来自FirstEvent的消息,使用onEventMainThread(SecondEvent event)接收来自SecondEvent 实例的消息,使用onEvent(ThirdEvent event) 来接收ThirdEvent 实例的消息。package com.harvic.tryeventbus2;import com.harvic.other.FirstEvent;import com.harvic.other.SecondEvent;import com.harvic.other.ThirdEvent;import de.greenrobot.event.EventBus;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {Button btn;TextView tv;EventBus eventBus;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);EventBus.getDefault().register(this);btn = (Button) findViewById(R.id.btn_try);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(getApplicationContext(),SecondActivity.class);startActivity(intent);}});}public void onEventMainThread(FirstEvent event) {Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());}public void onEventMainThread(SecondEvent event) {Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());}public void onEvent(ThirdEvent event) {Log.d("harvic", "OnEvent收到了消息:" + event.getMsg());}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();EventBus.getDefault().unregister(this);}}到这里,代码就结束 了,从上面的代码,我们可以看到,EventBus是怎么接收消息的,是根据参数中类的实例的类型的判定的,所以当如果我们在接收时,同一个类的实例参数有两个函数来接收会怎样?答案是,这两个函数都会执行,下面实验一下:伟人之所以伟大,是因为他与别人共处逆境时,

EventBus使用详解(二)

相关文章:

你感兴趣的文章:

标签云: