EventBus是什么?
EventBus由greenrobot组织贡献(该组织还贡献了greenDAO),一个Android事件发布/订阅轻量级框架,下面来一张图作为说明。
EventBus有什么用?
我们可以通过解耦发布者和订阅者简化Android事件传递。
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。
使代码简单
快,高性能:特别是在注重性能的Android上。也许在其同类的解决方案是最快的。
小(jar包小于50K),但是强大:EventBus是一个很小的库,它的API超级简单。
android主线程传递:当和UI交互的时候,无论这个事件是怎么提交的,EventBus都可以在主线程传递事件。
如何使用
首先在你的项目中添加eventbus的依赖
compile 'org.greenrobot:eventbus:3.0.0'
这里给大家举一个例子,MainActivity打开CommonActivity,在CommonActivity发出一个事件,然后MainActivity做出相应的反馈。
package cn.lxt.stickeventbus;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//首先要在你要接受EventBus的界面注册,这一步很重要
EventBus.getDefault().register(this);
Button btnCommon = (Button) findViewById(R.id.btn_common);
btnCommon.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_common:
//点击按钮进入CommonActivity
CommonActivity.start(this);
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//在界面销毁的地方要解绑
EventBus.getDefault().unregister(this);
}
//任意写一个方法,给这个方法一个@Subscribe注解,参数类型可以自定义,但是一定要与你发出的类型相同
@Subscribe
public void getEventBus(Integer num) {
if (num != null) {
//这里拿到事件之后吐司一下
Toast.makeText(this, "num" + num, Toast.LENGTH_SHORT).show();
}
}
}
接下来就是在CommonActivity里面
package cn.lxt.stickeventbus;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import org.greenrobot.eventbus.EventBus;
/**
* Created by Administrator on 2017/8/16 0016.
*/
public class CommonActivity extends AppCompatActivity implements View.OnClickListener {
public static void start(Context context) {
context.startActivity(new Intent(context, CommonActivity.class));
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_common);
Button button = (Button) findViewById(R.id.btn_send);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send:
//点击按钮,发送一个int类型的事件
EventBus.getDefault().post(666);
finish();
break;
}
}
}
接下来给大家看效果图
大家可以清晰的看到,666弹出来了。当然,EventBus之所以好用,自然有他的强大之处,比如说,我在子线成发送的消息,在接受的地方切换到主线程,只需要增加一个参数即可,那么接下来就要说到线程模式了。
线程模式
我们把发送消息放到子线程,把接收消息放到主线程并且更新UI。
CommonActivity 里面发送消息放到子线程
new Thread(new Runnable() {
@Override
public void run() {
EventBus.getDefault().post(666);
finish();
}
}).start();
MainActivity里面接收事件,只需要指定线程模式即可,即threadMode = ThreadMode.MAIN
@Subscribe(threadMode = ThreadMode.MAIN)
public void getEventBus(Integer num) {
if (num != null) {
Toast.makeText(this, "num" + num, Toast.LENGTH_SHORT).show();
}
}
相信大家看到了EventBus的强大之处,EventBus有4种线程模式,POSTING,MAIN,BACKGROUND,ASYNC,默认线程是POSTING。
POSTING
默认情况下,EventBus使用的就是这个模式,说白了就是你在哪个线程发送事件,就在哪个线程接收事件。
MAIN
相信大家刚才也能看到,MAIN就是将接受事件放到主线程执行。
BACKGROUND
在后台线程接收事件。如果不是在主线程提交,事件处理方法会直接在提交线程被调用。如果是在主线程提交,EventBus使用一个单独的后台线程按顺序传递所有事件。事件处理使用这种模式应该能够尽快返回避免阻塞后台线程。
ASYNC
在一个单独的线程接收事件。这个线程通常和提交的线程和主线程是独立的。提交的事件从不等待事件处理方法。事件处理方法如果需要花费一段时间比如访问网络应该使用这种模式。避免在同一时间触发大量长时间异步的处理方法来限制并发的线程。EventBus使用一个线程池来有效重复利用线程完成的异步事件处理程序的通知。
Stick Event
前面也说到了,EventBus可以取代intent在Activity或者Fragment中传值,我们如果用前面那样传值肯定是不行的,应该怎么做呢?这时候就要用到EventBus另外一个功能了,Stick Event,那么接下来就给大家带来Stick Event的使用。
package cn.lxt.stickeventbus;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnStick = (Button) findViewById(R.id.btn_stick);
btnStick.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_stick:
//点击按钮,跳转到StickActivity并携带参数,参数类型为String
EventBus.getDefault().postSticky("我是黏性事件");
StickActivity.start(this);
break;
}
}
}
package cn.lxt.stickeventbus;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
/**
* Created by Administrator on 2017/8/16 0016.
*/
public class StickActivity extends AppCompatActivity {
public static void start(Context context) {
context.startActivity(new Intent(context, StickActivity.class));
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stick);
//前面也说了,在任何你要接收事件的地方都要先注册
EventBus.getDefault().register(this);
}
//同样的,自定义一个方法,加上 @Subscribe,不同的是在后面再加上一句sticky = true告诉EventBus这是一个粘性事件
@Subscribe(sticky = true)
public void getEventBus(String str) {
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//别忘了在onDestroy里面解绑
EventBus.getDefault().unregister(this);
}
}
接下来还是大家看一下效果图
在进入StickActivity 之后,我们接收到了MainActivity发出的事件。
总结
EventBus的使用就说到这里,基本能满足大家日常开发的需求了,文章中如果有任何错误欢迎指出,共同学习共同进步,当然如果有任何疑问,也欢迎留言。