1、概述
最近大家面试说经常被问到EventBus,github上果断down了一份,地址:https://github.com/greenrobot/EventBus,的确是个不错的框架,主要用于事件的发布和订阅。
EventBus定义:是一个发布 / 订阅的事件总线。
这么说应该包含4个成分:发布者,订阅者,事件,总线。
那么这四者的关系是什么呢?
很明显:订阅者订阅事件到总线,发送者发布事件。
大体应该是这样的关系:
订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。
好了,大体了解基本的关系以后,我们通过案例驱动来教大家如何使用;
2、代码是最好的老师
相信大家对Fragment都有所了解,现在我们的需求是这样的,两个Fragment组成主界面,左边的Fragment是个目录、即列表,右边的Fragment是详细信息面板;
a、目录的列表是从网络获取的。
b、当点击目录上的条目时,动态更新详细信息面板;
效果图:
看了这个需求,我们传统的做法是:
a、目录Fragment在onCreate中去开启线程去访问网络获取数据,获取完成以后,通过handler去更新界面。
b、在目录的Fragment中提供一个接口,然后详细信息面板去注册这个接口,当发生点击时,去回调这个接口,让详细信息面板发生改变。
其实这种做法也还是不错的,但是有了EventBus之后,我们交互会发生什么样的变化呢?拭目以待吧。
首先提一下:
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅
1、MainActivity及其布局
|
package com.angeldevil.eventbusdemo; import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
<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> |
可以看到,我们MainActvity可以说没有一行代码,布局文件即两个Fragment组成;
2、ItemListFragment
首先看个实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
package com.angeldevil.eventbusdemo; import java.util.ArrayList; import java.util.List; public class Item { public String id; public String content; public static List<Item> ITEMS = new ArrayList<Item>(); static { // Add 6 sample items. addItem(new Item("1", "Item 1")); addItem(new Item("2", "Item 2")); addItem(new Item("3", "Item 3")); addItem(new Item("4", "Item 4")事件的发布和订阅。
EventBus定义:是一个发布 / 订阅的事件总线。
这么说应该包含4个成分:发布者,订阅者,事件,总线。
那么这四者的关系是什么呢?
很明显:订阅者订阅事件到总线,发送者发布事件。
大体应该是这样的关系:
订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。
好了,大体了解基本的关系以后,我们通过案例驱动来教大家如何使用;
2、代码是最好的老师
相信大家对Fragment都有所了解,现在我们的需求是这样的,两个Fragment组成主界面,左边的Fragment是个目录、即列表,右边的Fragment是详细信息面板;
a、目录的列表是从网络获取的。
b、当点击目录上的条目时,动态更新详细信息面板;
效果图:
看了这个需求,我们传统的做法是:
a、目录Fragment在onCreate中去开启线程去访问网络获取数据,获取完成以后,通过handler去更新界面。
b、在目录的Fragment中提供一个接口,然后详细信息面板去注册这个接口,当发生点击时,去回调这个接口,让详细信息面板发生改变。
其实这种做法也还是不错的,但是有了EventBus之后,我们交互会发生什么样的变化呢?拭目以待吧。
首先提一下:
EventBus.getDefault().register(this);//订阅事件
EventBus.getDefault().post(object);//发布事件
EventBus.getDefault().unregister(this);//取消订阅
1、MainActivity及其布局
|
package com.angeldevil.eventbusdemo; import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
<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> |
可以看到,我们MainActvity可以说没有一行代码,布局文件即两个Fragment组成;
2、ItemListFragment
首先看个实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
package com.angeldevil.eventbusdemo; import java.util.ArrayList; import java.util.List; public class Item { public String id; public String content; public static List<Item> ITEMS = new ArrayList<Item>(); static { // Add 6 sample items. addItem(new Item("1", "Item 1")); addItem(new Item("2", "Item 2")); addItem(new | |