1. EventBus使用分析
代码参照 鸿洋博客
下边通过EventBus基本使用,分析它的流程
ItemListFragment代码如下:
public class ItemListFragment extends ListFragment {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// 订阅事件
EventBus.getDefault().register(this);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// 开启线程加载列表
new Thread(){
@Override
public void run() {
// super.run();
try {
// 模拟子线程,加载网络数据,然后调用下边方法发布事件
Thread.sleep(2000);
// 发布事件
EventBus.getDefault().post(new Event.ItemListEvent(Item.ITEMS));
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 点击ListView的item发布事件
*/
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// 发布事件
EventBus.getDefault().post(getListView().getItemAtPosition(position));
}
/**
* 如果方法名以onEvent开始,表示要订阅一个事件,MainThread表示该方法在主线程中执行
* 只要一发布事件,就执行此方法
*/
public void onEventMainThread(Event.ItemListEvent event){
setListAdapter(new ArrayAdapter<Item>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, event.getItems()));
}
@Override
public void onDestroy(){
super.onDestroy();
// 取消事件
EventBus.getDefault().unregister(this);
}
}
分析上边流程:
1>:在 onCreate中执行 EventBus.getDefault().register(this)目的:
让EventBus扫描这个类,把 所有 onEvent开头的方法用 map存储,
key:onEvent方法的参数类型,value:所有onEvent方法;
在onCreate执行完后,onEventMainThread方法就 以键值对 存储到 EventBus 中了;
2>:在 子线程执行完后,调用 Event.getDefault().post(参数) , 根据 post的参数,在map中 查找对应的onEventMainThread方法,然后用 反射 执行 onEventMainThread方法更新数据;
网友评论