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

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


参考资料:

1.Android中开源库EventBus使用详解

2.Android解耦库EventBus的使用和源码分析

来自为知笔记(Wiz)

时间: 2024-09-27 07:30:53

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

消息传递机制

每个应用或多或少都由一些需要相互传递消息的对象结合起来以完成任务.在这篇文章里,我们将介绍所有可用的消息传递机制,并通过例子来介绍怎样在苹果的框架里使用.我们还会选择一些最佳范例来介绍什么时候该用什么机制. 虽然这一期的主题是关于 Foundation 框架的,但是我们会超出 Foundation 的消息传递机制 (KVO 和 通知) 来讲一讲 delegation,block 和 target-action 几种机制. 当然,有些情况下该使用什么机制没有唯一的答案,所以应该按照自己的喜好去试试

Handler、Looper消息传递机制

一.Handler消息传递机制初步认识: (一).引入: 子线程没有办法对UI界面上的内容进行操作,如果操作,将抛出异常:CalledFromWrongThreadException 为了实现子线程中操作UI界面,Android中引入了Handler消息传递机制,目的是打破对主线程的依赖性. 什么是Handler? handler通俗一点讲就是用来在各个线程之间发送数据的处理对象.在任何线程中,只要获得了另一个线程的handler,则可以通过  handler.sendMessage(messa

Android笔记二十五.Android事件Handler消息传递机制

因为Android平台不同意Activity新启动的线程訪问该Activity里的界面控件.这样就会导致新启动的线程无法动态改变界面控件的属性值.但在实际Android应用开发中,尤其是涉及动画的游戏开发中,须要让新启动的线程周期性地改变界面控件的属性值,这就须要借助Handler的消息传递机制实现. 一.Handler类简单介绍 1.功能 Handler类主要有两个作用 (1)在新启动的线程中发送消息; (2)在主线程中获取消息.处理消息.即当须要界面发生变化的时候.在子线程中调用Handle

解析Android的 消息传递机制Handler

1. 什么是Handler: Handler 网络释义"操纵者,管理者的"意思,在Android里面用于管理多线程对UI的操作: 2. 为什么会出现Handler: 在Android的设计机制里面,只允许主线程(一个程序第一次启动时所移动的线程,因为此线程主要是完成对UI相关事件的处理,所以也称UI线程) 对UI进行修改等操作,这是一种规则的简化,之所以这样简化是因为Android的UI操作时线程不安全的,为了避免多个线程同时操作UI造成线程安全 问题,才出现了这个简化的规则. 由此以

Android基础入门教程——3.3 Handler消息传递机制浅析

Android基础入门教程--3.3 Handler消息传递机制浅析 标签(空格分隔): Android基础入门教程 本节引言 前两节中我们对Android中的两种事件处理机制进行了学习,关于响应的事件响应就这两种:本节给大家讲解的 是Activity中UI组件中的信息传递Handler,相信很多朋友都知道,Android为了线程安全,并不允许我们在UI线程外操作UI:很多时候我们做界面刷新都需要通过Handler来通知UI组件更新!除了用Handler完成界面更新外,还可以使用runOnUiT

安卓开发_深入理解Handler消息传递机制

一.概述 因为子线程的run()方法无法修改UI线程(主线程)的UI界面,所以Android引入了Handler消息传递机制,实现在新创建的线程中操作UI界面 二.消息类(Message) 消息类是存放在MessageQueue中的,而一个MessageQueue中可以包含多个Message对象 每一个Message对象可以通过Message.obtain()或者Handler.obtainMessage()方法获得 一个Message具有的属性: 属性 类型 介绍 arg1 int 存放整型数

Android异步更新UI的方式之使用Handler消息传递机制

由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,给大家介绍一种方式:使用Handler消息传递机制. 下面用这种方式更新一个TextView: package com.example.runonuithreadtest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; public

Android Handler消息传递机制详解

1.为什么要用Handler 出于性能优化的考虑,Android UI操作并不是线程安全,如果有多个线程并发操作UI组件,可能导致线程安全问题.可以设想下,如果在一个Activity中有多个线程去更新UI,并且都没有加锁机制,可能会导致什么问题? 界面混乱,如果加锁的话可以避免该问题但又会导致性能下降.因此,Android规定只允许UI线程修改Activity的UI组件.当程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,比如用户

Android Handler消息传递机制

1. Handler消息传递机制初步认识:什么是Handler? handler通俗一点讲就是用来在各个线程之间发送数据的处理对象.在任何线程中,只要获得了另一个线程的handler,则可以通过 handler.sendMessage(message)方法向那个线程发送数据.基于这个机制,我们在处理多线程的时候可以新建一个thread,这个thread拥有UI线程中的一个handler.当thread处理完一些耗时的操作后通过传递过来的handler向UI线程发送数据,由UI线程去更新界面. 主