EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
(1)在要接收消息的页面注册,比如activity的onCreate()方法里面加入下面方法:
EventBus.getDefault().register(this);
(2)退出接收页面的时候解绑,比如在activity的onDestory()方法里面加入下面方法:
EventBus.getDefault().unregister(this);
(3)发送消息,post方法里面是一个object,可以传任何对象,我这边用的是枚举,你当然也可以用自定义对象,字符串,都可以。
EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);
public enum Event {
/**
* 图片成功
*/
IMAGE_LOADER_SUCCESS,
}
4)在接受消息的页面实现此方法(共有四个函数)
@Override
public void onEventMainThread(Event event) {
super.onEventMainThread(event);
switch (event){
case IMAGE_LOADER_SUCCESS:
clearEditContent();
break;
}
}
接收页面是如何接收到通知的呢?接收页面的Event的值跟EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);的发送的值相同,则此页面就接收到通知,如果多个页面都有同一个event,则这几个页面都可以收到通知。
(1)EventBus还有另外有个不同的函数,他们分别是:
1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
界面如下所示:
---->------->
然后在第三个界面,点击【发送通知】按钮,通知前两个界面。
基础类代码如下:
package com.test.eventbus;
import android.app.Activity;
import android.os.Bundle;
import de.greenrobot.event.EventBus;
/**
* <功能详细描述>
*
* @author caoyinfei
* @version [版本号, 2016/6/15]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
EventBus.getDefault().register(this);
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
public void onEventMainThread(Event event) {
}
}
三个页面代码如下所示:
package com.test.eventbus;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends BaseActivity {
private Button next;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
next = (Button) findViewById(R.id.next);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
@Override
public void onEventMainThread(Event event) {
super.onEventMainThread(event);
switch (event){
case IMAGE_LOADER_SUCCESS:
Log.i("cyf","MainActivity");
break;
}
}
}
package com.test.eventbus;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends BaseActivity {
private Button next;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
next = (Button) findViewById(R.id.next);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
startActivity(intent);
}
});
}
@Override
public void onEventMainThread(Event event) {
super.onEventMainThread(event);
switch (event){
case IMAGE_LOADER_SUCCESS:
Log.i("cyf", "SecondActivity");
break;
}
}
}
package com.test.eventbus;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import de.greenrobot.event.EventBus;
public class ThirdActivity extends BaseActivity {
private Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);
}
});
}
}
运行结果如下所示:
06-15 13:51:15.891 15665-15665/com.test.eventbus I/cyf: MainActivity
06-15 13:51:15.891 15665-15665/com.test.eventbus I/cyf: SecondActivity
接收页面的Event的值跟EventBus.getDefault().post(Event.IMAGE_LOADER_SUCCESS);的发送的值相同,则此页面就接收到通知,如果多个页面都有同一个event,则这几个页面都可以收到通知。------------验证了确实是这样的。
项目地址:http://download.csdn.net/detail/dfskhgalshgkajghljgh/9550157
欢迎一起交流讨论
群号:469890293