android开发中会经常遇到线程之间,类与类之间的传参问题,之前解决办法很麻烦,但是现在有了传值框架eventbus,只需要注册为订阅者就能接收你想要传递过来的参数了,很方便,再此强烈推荐给大家,快来学习一下吧。
底层:不是广播而是handler
优势:
可以将事件发送给任意组件,将任意参数传递给任意的类。
代码简单逻辑易懂
通过注解的方式标识订阅者
参数怎样传递不再是关注的重点,只需要关注谁是发布者谁是订阅者。
基本使用步骤:
1.添加依赖:
compile 'org.greenrobot:eventbus:3.0.0'
2.定义事件:
public static class MessageEvent { /* Additional fields if needed */ }
或者直接定义要传递的Message:
Message msg = Message.obtain(); msg.what = 1; msg.obj = xxx;
3.发送事件
EventBus.getDefault().post(new MessageEvent());
或者直接发送Message
EventBus.getDefault().post(msg);
4.声明和注释你的订阅方法,并选择指定线程模式。里面参数是你传递过来的东西
如果接收的参数是事件,方法参数写MessageEvent类型:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
如果接收的参数是消息,方法参数写Message类型:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(Messge msg) {/* Do something */};
5.注册和注销eventbus传参事件。(比如你在service里面订阅的,就写service里面),也可以在oncreate()和ondestroy里面注册和注销。千万不要忘记写这一步,否则你将接收不到你传递过来的参数或者事件。
@Overridepublic void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Overridepublic void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
注意事项,接收类型必须与发送类型一致,否则不能接收
模拟后台下载文件,前台显示进度的一个示例:
添加依赖和权限,以及activity和service在清单文件的配置啥的我就不详细说了。
在activity写一个“下载文件”的按钮,点击事件如下:
@OnClick(R.id.bt_download)
public void download() {
//开启服务
startService(new Intent(this, DownloadService.class));
String path = "http://baidu.com/2xx.apk";
Message msg = Message.obtain();
msg.obj = path;
msg.what = 1;
EventBus.getDefault().post(msg);
}
DownloadService需要获取文件路径,则需要注册成为订阅者,然后开启子线程模拟下载,并把进度发送给activity
public class DownloadService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(Message msg) {
if (msg.what == 1) {
Toast.makeText(this, "开始下载" + msg.obj, Toast.LENGTH_SHORT).show();
//开启子线程模拟更新下载进度
new Thread() {
@Override
public void run() {
super.run();
for (int i = 0; i <= 100; i++) {
Message msg = new Message();
msg.obj = i;
msg.what = 2;//更新进度
EventBus.getDefault().post(msg);
SystemClock.sleep(50);
}
}
}.start();
}
}
@Override
public void onCreate() {
super.onCreate();
EventBus.getDefault().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
activity需要获取下载进度更新ui,所以也需要注册成为订阅者
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(Message msg) {
if (msg.what == 2) {
btDownload.setText((Integer) msg.obj + "%");
if ((Integer) msg.obj == 100) {
btDownload.setText("下载完成");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}