Android EventBus实战 没听过你就out了

转载请表明出处:,本文出自:【张鸿洋的博客】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{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}<LinearLayout xmlns:android=""xmlns: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" ><fragmentandroid:id="@+id/item_list"android:name="com.angeldevil.eventbusdemo.ItemListFragment"android:layout_width="0dip"android:layout_height="match_parent"android:layout_weight="1" /><fragmentandroid: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

首先看个实体类:

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"));addItem(new Item("5", "Item 5"));addItem(new Item("6", "Item 6"));}private static void addItem(Item item){ITEMS.add(item);}public Item(String id, String content){this.id = id;this.content = content;}@Overridepublic String toString(){return content;}}package com.angeldevil.eventbusdemo;import android.os.Bundle;import android.support.v4.app.ListFragment;import android.view.View;import android.widget.ArrayAdapter;import android.widget.ListView;import com.angeldevil.eventbusdemo.Event.ItemListEvent;import de.greenrobot.event.EventBus;public class ItemListFragment extends ListFragment{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// RegisterEventBus.getDefault().register(this);}@Overridepublic void onDestroy(){super.onDestroy();// UnregisterEventBus.getDefault().unregister(this);}@Overridepublic void onViewCreated(View view, Bundle savedInstanceState){super.onViewCreated(view, savedInstanceState);// 开启线程加载列表new Thread(){public void run(){try{Thread.sleep(2000); // 模拟延时// 发布事件,在后台线程发的事件EventBus.getDefault().post(new ItemListEvent(Item.ITEMS));} catch (InterruptedException e){e.printStackTrace();}};}.start();}public void onEventMainThread(ItemListEvent event){setListAdapter(new ArrayAdapter<Item>(getActivity(),android.R.layout.simple_list_item_activated_1,android.R.id.text1, event.getItems()));}@Overridepublic void onListItemClick(ListView listView, View view, int position,long id){super.onListItemClick(listView, view, position, id);EventBus.getDefault().post(getListView().getItemAtPosition(position));}}

ItemListFragment里面在onCreate里面进行了事件的订阅,onDestroy里面进行了事件的取消;onViewCreated中我们模拟了一个子线程去网络加载数据,获取成功后我们调用

了EventBus.getDefault().post(new ItemListEvent(Item.ITEMS));发布了一个事件;

onListItemClick则是ListView的点击事件,我们调用了EventBus.getDefault().post(getListView().getItemAtPosition(position));去发布一个事件,

getListView().getItemAtPosition(position)的类型为Item类型;

细心的你一定发现了一些诡异的事,直接new Thread()获取到数据以后,竟然没有使用handler;我们界面竟然发生了变化,那么List是何时绑定的数据?

仔细看下代码,发现这个方法:

背着背包的路上,看过许多人,听过许多故事,

Android EventBus实战 没听过你就out了

相关文章:

你感兴趣的文章:

标签云: