EventBus 事件总线 简介 案例

简介

地址:https://github.com/greenrobot/EventBus

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.

优点是开销小,代码更优雅,以及将发送者和接收者解耦。

包含4个成分:发布者,订阅者,事件,总线。

这四者的关系:订阅者订阅事件到总线,发送者发布事件;订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。



EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async

方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可
  • onEventMainThread代表这个方法会在UI线程执行
  • onEventPostThread代表这个方法会在当前发布事件的线程执行
  • BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用
  • Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个

Activity




public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    }

}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:baselineAligned="false"     android:divider="?android:attr/dividerHorizontal"     android:orientation="horizontal"     android:showDividers="middle" >     <fragment         android:id="@+id/item_list"         android:name="com.angeldevil.eventbusdemo.ItemListFragment"         android:layout_width="0dip"         android:layout_height="match_parent"         android:layout_weight="1" />     <fragment         android:id="@+id/item_detail_container"         android:name="com.angeldevil.eventbusdemo.ItemDetailFragment"         android:layout_width="0dip"         android:layout_height="match_parent"         android:layout_weight="2" /> </LinearLayout>

列表Fragment


/**

 * 1、在onCreate里面执行    EventBus.getDefault().register(this)意思是让EventBus【扫描当前类】,把所有以【onEvent】开头的方法使用Map记录下来<br>

 *      其中Key为方法的参数类型,Value值为包含该方法的对象,我们的【onEvent***()】方法就以键值对的形式存储到了EventBus中<br>

 * 2、当我们调用EventBus.getDefault().post(**)发布一个事件时,EventBus会根据post中的参数类型,去Map中查找对应的方法<br>

 * 3、于是在当前类中找到了我们的onEventMainThread(**)方法,最后通过反射去执行此方法。这就是为什么没有接口却能发生回调的原因。

 */

public class ItemListFragment extends ListFragment {

    private List<String> items = new ArrayList<String>();

    @Override

    public void onCreate(Bundle savedInstanceState) {//在onCreate里面进行了事件的订阅,onDestroy里面进行了事件的取消

        super.onCreate(savedInstanceState);

        EventBus.getDefault().register(this);

    }

    @Override

    public void onDestroy() {

        super.onDestroy();

        EventBus.getDefault().unregister(this);

    }

    @Override     public void onViewCreated(View view, Bundle savedInstanceState) {         super.onViewCreated(view, savedInstanceState);         // 开启线程加载列表         new Thread() {             public void run() {                 try {                     for (int i = 0; i < 10; i++) {                         items.add("id=" + i);                     }                     Thread.sleep(1000); // 模拟延时                     // 在后台线程发布一个事件(一个FirstEvent的实例),当这个事件发布后,我们的onEventMainThread就被调用了(因为接收的是一个FirstEvent的实例)                     EventBus.getDefault().post(new FirstEvent(items));                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             };         }.start();     }     @Override     public void onListItemClick(ListView listView, View view, int position, long id) {         super.onListItemClick(listView, view, position, id);         //当点击ListView的Item时,在UI线程发布一个事件(SecondEvent类型)         EventBus.getDefault().post(new SecondEvent("包青天" + position));     }     /**      * 方法名以【onEvent】开头,代表要订阅一个事件;【MainThread】意思这个方法最终要在UI线程执行;当指定事件发布的时候,这个方法就会在UI线程自动执行      */     public void onEventMainThread(FirstEvent event) {         ListAdapter adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_activated_1, android.R.id.text1, event.getItems());         setListAdapter(adapter);         //点击第一个item,只需要position即可         onListItemClick(null, null, 0, 0);     } }

详情Fragment


public class ItemDetailFragment extends Fragment {

    private TextView tv_info;

    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        tv_info = new TextView(getActivity());

        tv_info.setTextColor(Color.BLUE);

        tv_info.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);

        return tv_info;

    }

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        EventBus.getDefault().register(this);

    }

    @Override

    public void onDestroy() {

        super.onDestroy();

        EventBus.getDefault().unregister(this);

    }

    /** List点击时会发送此事件,接收到事件后更新详情 */     public void onEventMainThread(SecondEvent item) {         if (item != null) tv_info.setText("\n我收到了ItemListFragment发送的事件\n\n内容为:" + item.content);     } }

事件


/** 一个自定义的类,封装要发送的内容提供 */

public class FirstEvent {

    private List<String> items;

    public FirstEvent(List<String> items) {

        this.items = items;

    }

    public List<String> getItems() {

        return items;

    }

}

public class SecondEvent {     public String content;     public SecondEvent(String content) {         this.content = content;     } }

来自为知笔记(Wiz)

附件列表

时间: 2024-08-11 16:21:49

EventBus 事件总线 简介 案例的相关文章

Guava - EventBus(事件总线)

Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计. 不再多的废话,直奔Guava EventBus主题.首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式.当然如果我们想其为单例,我们可以很容易封装它,一个单例模式保证只创建一个实例就对了. 下面

EventBus事件总线分发库

本文围绕以下六个部分展开: 一.事件总线管理 二.EventBus 三.EventBus与BroadcastReceiver的区别 案例一 案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据 案例三:Activity和Service之间互相发布与接收事件 一.事件总线管理 将事件放入队列里,用于管理和分发. (1)保证应用的各个部分之间高效的通信及数据.事件分发. (2)模块间解耦:通过事件的分发,可以让各个模块间关联程序变小. 当在开发一些庞大的的项目时,模块比较多,这

Android EventBus事件总线剖析

概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息. 它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,而不需要以层层传递接口的形式去单独构建通信桥梁.从而降低因多重回调导致的模块间强耦合,同时避免产生大量内部类.它拥有使用方便,性能高,接入成本低和支持多线程的优点,实乃模块解耦.代码重构必备良药.

Orchard EventBus 事件总线及 IEventHandler作用

事件总线接口定义: public interface IEventBus : IDependency { IEnumerable Notify(string messageName, IDictionary<string, object> eventData); } messageName 参数说明 : _eventBus.Notify(interfaceName + "." + methodName, data/*接口方法参数*/); 事件总线作用: 当调用Notify时

EventBus 事件总线 原理

原理 一句话描述:register会把当前类中匹配的方法,存入一个map,而post会根据实参去map查找进行反射调用 撇开专业术语,其实EventBus就是在内部[存储]了一堆onEvent开头的方法,然后post的时候,根据post传入的[参数],去找到匹配的方法,[反射]调用之. 另外,它内部使用了[Map]进行存储,[键就是参数的Class类型].知道是这个类型,那么你觉得根据post传入的参数进行查找还是个事么? 其实不用发布者,订阅者,事件,总线这几个词或许更好理解,以后大家问了Ev

EventBus 事件总线模式实例(发布/订阅事件)

在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用. 1. 首先我们的新建一个类,这个类其实是用于总线传递的模型 using System; namespace PurchaseDevices.Model.CommonModel{/// <summary>/// 事件传递参数/// </summary>/// <typeparam name="T"></typep

EventBus事件总线框架(发布者/订阅者模式,观察者模式)

一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. Intent进行组件间通信,广播方式. 二.单例比较好的写法: private static volatile EventBus defaultInstance; 构造函数应当是private,不应该是public 1 public static EventBus getDefault() { 2 if

android事件总线(eventbus)设计与实现

1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量. AndroidEventBus吸收了greenrobot的EventBus以及square的otto的优点,并在此基础上做出了相应的改进,使得事件总线框架更适合用户的使用习惯,也使得事件的投递更加的精准.灵活. 与EventBus.otto

AndroidEventBus ( 事件总线 ) 的设计与实现

1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量. AndroidEventBus吸收了greenrobot的EventBus以及square的otto的优点,并在此基础上做出了相应的改进,使得事件总线框架更适合用户的使用习惯,也使得事件的投递更加的精准.灵活. 与EventBus.otto