在
https://github.com/greenrobot/EventBus 中下载 EventBus
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法
使用方法
1> 定义事件, 定义一个类,继承默认的Object即可,用于区分事件和传输数据,如:
public class MsgEvent1 {
private String msg;
public MsgEvent1(String msg)
{
super ();
this .msg = msg;
}
public String getMsg()
{
return msg ;
}
}
public class MsgEvent2 {
private String msg;
public MsgEvent2(String msg)
{
super ();
this .msg = msg;
}
public String getMsg()
{
return msg ;
}
}
2> 添加订阅者:EventBus.getDefault().register(this); 将所在类作为订阅者,框架会通过反射机制获取所有方法及其参数,有如下四种方法:
订阅者所在类可以定义以下一个或多个方法用以接收事件:
public void onEvent(param)
public void onEventMainThread(param)
public void onEventBackgroundThread(param)
public void onEventAsync(param)
如:
public class RightFragment extends Fragment {
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
// 界面创建时,订阅事件, 接受消息
EventBus. getDefault().register( this);
}
@Override
public void onDestroy() {
super .onDestroy();
// 界面销毁时,取消订阅
EventBus. getDefault().unregister( this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_right , null);
tv = (TextView) view.findViewById(R.id. tv );
return view;
}
/**
* 与发布者在同一个线程
*
* @param msg
* 事件1
*/
public void onEvent(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEvent(MsgEvent1 msg)收到" + content);
}
/**
* 执行在主线程。 非常实用,可以在这里将子线程加载到的数据直接设置到界面中。
*
* @param msg
* 事件1
*/
public void onEventMainThread(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEventMainThread(MsgEvent1 msg)收到" + content);
tv.setText(content);
}
/**
* 执行在子线程,如果发布者是子线程则直接执行,如果发布者不是子线程,则创建一个再执行 此处可能会有线程阻塞问题。
*
* @param msg
* 事件1
*/
public void onEventBackgroundThread(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEventBackgroundThread(MsgEvent1 msg)收到" + content);
}
/**
* 执行在在一个新的子线程 适用于多个线程任务处理, 内部有线程池管理。
*
* @param msg
* 事件1
*/
public void onEventAsync(MsgEvent1 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEventAsync(MsgEvent1 msg)收到" + content);
}
/**
* 与发布者在同一个线程
*
* @param msg
* 事件2
*/
public void onEvent(MsgEvent2 msg) {
String content = msg.getMsg() + "\n ThreadName: " + Thread.currentThread ().getName() + "\n ThreadId: " + Thread.currentThread().getId();
System. out .println("onEvent(MsgEvent2 msg)收到" + content);
tv.setText(content);
}
}
注:发布者 post方法参数是Object类型,也就是可以发布任何事件。订阅者接受消息时,只要定义的是第二步四个方法任意一个,并且参数和发布者发布的一致,即可被执行。发布者也可以通过第二步接收消息,订阅者也可以作为发布者发消息给自己
3> 发布者发布事件
public class LeftFragment extends ListFragment {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super .onViewCreated(view, savedInstanceState);
String[] strs = new String[] { "主线程消息1" , "子线程消息1" , "主线程消息2" };
setListAdapter( new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1 , strs));
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
switch (position) {
case 0:
// 主线程
System. out .println("----------------------主线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
EventBus. getDefault().post( new MsgEvent1( "主线程发的消息1" ));
break ;
case 1:
// 子线程
new Thread() {
public void run() {
System. out .println("----------------------子线程发的消息1" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
EventBus. getDefault().post( new MsgEvent1( "子线程发的消息1" ));
};
}.start();
break ;
case 2:
// 主线程
System. out .println("----------------------主线程发的消息2" + " threadName: " + Thread.currentThread().getName() + " threadId: " + Thread.currentThread().getId());
EventBus. getDefault().post( new MsgEvent2("主线程发的消息2" ));
break ;
}
}
}