码迷,mamicode.com
首页 > 其他好文 > 详细

整理:3种消息传递机制的比较:Handler、BroadcastReceiver、EventBus

时间:2015-08-18 15:47:10      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

摘要:本文主要写了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,当使用这种类型时,不管事件发起函数在哪里执行,都会另起一个线程去执行回调。

技术分享


参考资料:









整理:3种消息传递机制的比较:Handler、BroadcastReceiver、EventBus

标签:

原文地址:http://www.cnblogs.com/yutianran/p/4739332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!