EventBus在Activity、Fragment、Service中的使用
EventBus是Android的一个开源项目,它最重要的功能就是可以简化各个组件之间的消息传递,类似于Android自身的广播。但又比广播使用起来方便的多的多。
github地址:https://github.com/greenrobot/EventBus
官方文档:http://greenrobot.org/eventbus/documentation
1.在Android studio中
在build.gradle中添加
compile 'de.greenrobot:eventbus:2.4.0'
或在eclipse中
导入EventBus的jar包,直接将jar拷到工程目录的libs文件夹下即可。
2.定义一个MessageEvent类
这个类是一个普通的Object,没有任何特殊,我们用它作为消息传递的载体。
public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } }
3.注册EventBus。
在要接收消息的Activity或Fragmen或Service中注册EventBus。
我们可以在onCreate中进行注册,下面在Activity中的onCreat中进行注册,方法如下
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //进行EventBus的注册 EventBus.getDefault().register(this); }
4.发送消息。
发送消息是在要发送消息的Activity或Fragmen或Service中使用EventBus中的Post方法来实现发送的,发送过去的是我们新建的类的实例!
EventBus.getDefault().post(new MessageEvent("发送消息"));
5.接收消息。
在要接收消息的Activity或Fragmen或Service中复写框架中的前缀为onEvent方法,此方法有四种,按需求复写即可。一般情况下只需定义下面的第一种即可。
(1)我们只用定义这个方法就好,它并不是一个接口什么的,也不需要其他任何操作。这个方法执行在哪个线程是由post方法的那个线程决定的,它执行在哪个线程onEvent就执行在哪个线程,方法如下:
public void onEvent(MessageEvent event){ Toast.makeText(getActivity(),event.message, Toast.LENGTH_SHORT).show(); }
(2)如果我们现在想收到消息的时候将它保存起来,那么我们可以直接定义如下的一个方法:
public void onEventBackgroundThread(MessageEvent event){ saveToDisk(event.message); }
(3)下面这个方法会执行在主线程之外的某个子线程,如果post方法本身就是子线程,那么就与post方法执行在同一线程,需要注意的是,当多个post时,它不会主动新开线程,只会按顺序挨个执行,因此可以保证我们消息都按顺序保存了的。那如果我们想每次收到消息都新开一个线程来执行呢?只需定义如下的方法就好:
public void onEventAsync(MessageEvent event){ backend.send(event.message); }
(4)下面这个方法执行在于post及主线程都不相同的线程内。每次post都会新开一个线程。使用该方法时应考虑该方法触发的次数,千万别让线程过多,导致资源消耗过大。最后,最常用的,假如我们想在接受消息的时候更新UI,因为UI只能在主线程进行更新,因此我们希望接收到消息的方法执行在主线程,那么,我们可以直接定义一个如下的方法。
public void onEventMainThread(MessageEvent event) { textField.setText(event.message); }
5.注销EventBus。
在要接收消息的Activity或Fragmen或Service中进行注销,重写onDestroy( )方法
@Override protected void onDestroy(){ super.onDestroy(); EventBus.getDefault().unregister(this); }
更多相关文章
- Android EditText TextWatcher 回调方法参数说明
- Android 开发中的多线程编程技术
- Android生成界面的两种方法:setContentView和inflate的区别
- Android 使用Canvas在图片上绘制文字的方法
- Android 项目快速更改包名的方法
- 『ANDROID』 在Android开发过程中,常Android 更新UI的两种方法—