最近因为需要使用了greenrobot的Event3.0,我从官方的文档上看到eventbus3.0使用其实还挺简单的,但是在自己使用时总是出现这样那样的问题。官方文档的使用步骤是:1.在studio中添加依赖在buildgrad中添加compile 'org.greenrobot:eventbus:3.0.0',也可以在studio中对自己的项目右键open moduls setting
然后再出现的框中搜多eventbus找到greenrobot的添加进自己的项目即可。
2.自己构建一个类作为事件的载体我是这样理解的,这个类名字任意选取,我们接收消息就要使用这个类,类中的属性就是我们要发送和接收的内容。直接上官方的实例
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
3.在需要接收BUS消息的地方,创建一个接收的方法,注意这个方法必须的得是公共的方法,我们就是通过这个方法接收来自其他地方传递过来的消息内容。在构建好方法后我们必须对
这个方法进行添加,注解也只有添加了注解才能收到来自其他地方post来的消息。实例如:
// This method will be called when a MessageEvent is posted
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event){
doSomethingWith(event);
}
4.在接收消息的地方注册eventbus和解除注册eventbus。一般是注册在oncreat方法中,解除注册在ondestory()中,实例如:
注册我们可以直接调用默认的构造如:
EventBus.getDefault().register(this);
解除注册实例:
EventBus.getDefault().unregister(this);
5.在完成了以上步骤后,我们就可以在其他任何地方向接收的地方发布消息。我们只需要使用
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
就可以进行消息的发送,在发送送,发送的是我们已经定义好的对象,在接收方法中的参数也是这个对象。PS:我们发送的是什么对象我们接收方法的参数就是什么
对象。
我使用时遇到的问题:
发送的消息收不到。我遇到的问题是这样的,我是在住的activiy中向需要打开的activity所容纳的fragment发送消息。所发送的内容需要网络请求。我始终收不到消息内容,找了
半天也没有发现哪里有问题,后来自己测试了很久才找到了原因,网络请求需要一定的时间,所以在另外一个页面没有收到任何内容。我是这样处理的,我新建了一个线程
在需要收到消息的界面中,使用while死循环判断是否收到了消息,如果没有收到就不进行界面的更新,再在线程中使用runonUIthread方法进行页面的更新。
这样我就能保证我能收到消息。我的实例是这样的:
我是在碎片中需要的到消息
new Thread() { public void run() {
//判断消息是否为空,不空一直判断 while (tklist == null || tklist == null || tkdzlist == null || gklist == null) { } getActivity().runOnUiThread(new Runnable() {
//更新的内容
}
这样就解决了我的问题,如果自己的需要使用很多次,可以将自己的线程假如线程池中,便于线程的管理。初写博客,如果博客博客中有什么错误,希望给予批评指正,我愿意接受来自各位的意见。谢谢!