摘要:本文主要写了Handler、BroadcastReceiver、EventBus这三种消息传递机制的使用方法,这里强烈推荐使用最后一种,理由如下:1.完全解耦,发送者和接受者几乎没关联,删除其中一个对另外一个没影响(这一点Handler就不行)。2.传参数方便,同时支持一个发送者发送多条消息、一个接受者接受多条消息。
1.Handler:
(1).发送:
public Handler parentHandler;//此Handle的赋值在目的地
// 发送Handle通知
Message msg = new Message();
msg.what = PRAISE;
msg.obj = comment_id;
parentHandler.handleMessage(msg);
(2).接受:
// 接受Handle通知
Handler messageHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == B1_commentAdapter.PRAISE) {
comment_id = (String) msg.obj;
//具体的实现方法
praiseComment(comment_id);
}
}
};
adapter.parentHandler = messageHandler;//在目的地为Handle赋值
2.BroadcastReceiver:
(1).发送:
//发送Receiver通知
private void initReceiver() {
Intent intent = new Intent();
intent.setAction("action.refreshMsgNumber");
mContext.sendBroadcast(intent);
}
(2).接收:
//注册
private void initReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("action.refreshMsgNumber");
getActivity().registerReceiver(mRefreshBroadcastReceiver, intentFilter);
}
//反注册
@Override
public void onDestroy() {
super.onDestroy();
getActivity().unregisterReceiver(mRefreshBroadcastReceiver);
}
// 接受Receiver通知
private BroadcastReceiver mRefreshBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("action.refreshMsgNumber"))
{
//具体实现方法
refreshMsgNumber();
}
}
};
3.EventBus:
【资源】
1.需要下载eventbus.jar,我放在360云盘:http://yunpan.cn/cwDjxfGuMUKpD 访问密码 6b1b
【方法】
(1).发送:
// 发送Eventbus事件
EventBus.getDefault().post(
new MyToolNumberEvent(MyToolNumberEvent.SetToolNumber,weiyuedu));
(2).接受:
// 接受Eventbus事件
Handler messageHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == B1_commentAdapter.PRAISE) {
comment_id = (String) msg.obj;
//具体实现方法
praiseComment(comment_id);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册EventBus
EventBus.getDefault().register(this);
}
@Override
public void onDestroyView() {
super.onDestroyView();
//反注册EventBus
EventBus.getDefault().unregister(this);
}
/**
* 接受自定义的事件,并分发处理onEventMainThread也尅
* EventBus是根据MyToolNumberEvent等类名来判断监听的事件的,然后可以根据RefreshNumber等参数决定具体函数
* @param event
*/
public void onEventMainThread(MyToolNumberEvent event) {
switch (event.getAction()){
case MyToolNumberEvent.SetToolNumber:
showMsgNumber(event.getNumber());
break;
}
}
(3).自定义事件类:
//自定义事件:工具栏数字处理
public class MyToolNumberEvent implements Serializable{
public static final int SetToolNumber =0;//设置工具栏数字
public static final int RefreshNumber =1;//减少工具栏数字
int action;//事件名称
int number;//数据
public MyToolNumberEvent(int action,int number) {
this.action = action;
this.number = number;
}
public int getAction() {
return action;
}
public void setAction(int action) {
this.action = action;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
【其他】
接受的回调方法除了onEventMainThread,还有onEvent 、onEventBackgroundThread、onEventBusAsync,具体区别如下:
a、onEvent 它和ThreadModel中的PostThread对应,这个也是默认的类型,当使用这种类型时,回调函数和发起事件的函数会在同一个线程中执行
b、onEventMainThread,当使用这种类型时,回调函数会在主线程中执行,这个在Android中非常有用,因为在Android中禁止在子线程中修改UI
c、onEventBackgroundThread,当使用这种类型时,如果事件发起函数在主线程中执行,那么回调函数另启动一个子线程,如果事件发起函数在子线程执行,那么 回调函数就在这个子线程执行。
d、onEventBusAsync,当使用这种类型时,不管事件发起函数在哪里执行,都会另起一个线程去执行回调。
参考资料: