时间过得很快,转眼迎来了清明小长假,在小长假到来前期搞定了一个问题,心里还是很高兴的,这里分享给大家,希望大家遇到相同问题时能有有所帮助。
先说一下我的需求吧,在手头的项目里有这么一个需求,就是一个activity,它有三个fragment,activity要通过网络从服务端获取数据,然后分发给三个fragment展示。
最初,我是想用broadcastReceiver实现的,但是写了一堆代码以后发现不是想象的那么简单。当activity获取到数据后发送广播,此时FragmentA和FragmentB已经初始化完毕,当然也完成了BroadcastReceiver的注册,这两个是可以接受到activity传递过来的数据的,但是FragmentC就尴尬了,在activity发送广播的时候它还没有初始化,也就没有注册广播接收器,自然也就没有数据展示了。这个问题让我很是头大了一会儿,后来考虑的用一下EventBus试试,结果一试还真成了,哈哈哈哈,先让我笑几声,然后在这里记录一下EventBus的使用吧。
Androidstudio的gradle配置如下:
compile 'org.greenrobot:eventbus:3.0.0'
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public class FragmentA extends Fragment {
private static final String TAG = "FragmentA";
private TextView tvAAA;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_aa,container,false);
tvAAA=view.findViewById(R.id.text_a);
Log.d(TAG, "onCreateView: ");
//注册
EventBus.getDefault().register(this);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView: ");
//注销
EventBus.getDefault().unregister(this);
}
}
//事件订阅者处理事件,必须有此方法
//这里我们的ThreadMode设置为MAIN,事件的处理会在UI线程中执行,用TextView来展示收到的事件消息
//注意,这里的注解里必须有sticky,并将值设置为true,表示与事件绑定,可以在事件已经发送但是还没有注册的情况下,一旦注册,就可以接受到数据
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void onResult(MessageEvent messageEvent){
tvAAA.setText(messageEvent.getMessage());
}
private void sendMsg() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
runOnUiThread(new Runnable() {
@Override
public void run() {
EventBus.getDefault().postSticky(new MessageEvent("here is activity"));
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
简单的几行代码就实现了我们的要求是不是感觉so easy,不过效果虽然实现了,但是我们真正懂得了EventBus了吗,未必!下面大概了解一下EventBus:
EventBus有三个主要的元素需要我们先了解一下:
EventBus3.0有以下四种ThreadMode: