Agera,是Google在2016年开源的一个轻量级框架,有利于构建观察者模式的项目。
重写了一下官方Demo,整理了思路:Demo中发生的事件是:
用户触发SwipeRefreshLayout的下拉刷新事件,
->通知数据源获取数据
->获取数据结束时
->通知界面刷新
Agera里重点
首先Agera导入 compile “com.google.android.agera:agera:1.2.0”
方式 一
1、接口Updatable,继承后重写update()方法,在被dispatchUpdate()方法通知时便会触发,接住doSomething,即观察者。
2、类BaseObservable,继承后不需要重写方法 ,待自己的事件处理完后调用dispatchUpdate(),通知观察者执行update()方法,即被观察者。
3、Updatable与Observable用注册这种行为来联系,即Obsetvable.addUpdatable(Updatable)和Obsetvable.removeUpdatable(Updatable)。
4、接口Supplier,继承后重写get()方法,该方法用于提供数据,返回数据类型T,数据仓库或数据源,即数据提供者。
Agera方式一
项目重点文件
1 2 3 4
| AgeraDemo1View UI界面 DataFetcher 实际去获取数据的执行者 DataRepository 数据仓库,储存、提供数据 SRLayoutOnRefreshLister SwipeRefreshLayout的下拉刷新事件监听类
|
1、用户触发下拉事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class SRLayoutOnRefreshListener extends BaseObservable implements SwipeRefreshLayout.OnRefreshListener { @Override public void onRefresh() { dispatchUpdate(); } } 用户触发下拉事件 ->执行方法onRefresh() ->调用dispatchUpdate()通知数据仓库去获取数据,即使接下来调用update() 所以SRLayoutOnRefreshListener应该继承BaseObservable类, 即具备分发事件的方法dispatchUpdate(), 而数据仓库DataRepository应实现Updatable接口, 即拥有update()方法, 两者间用SRLayoutOnRefreshListener.addUpdatable(DataRepository)联系。
|
2、数据仓库获取数据
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 40 41 42 43 44 45 46 47 48 49 50 51
| 第1步走完后,我们知道DataRepository应该实现Updatable接口 class DataRepository implements Updatable 此时DataRepository类中的update()调起 @Override public void update() { dataFetcher.get(this); //执行者去获取数据,方法传入回调接口,以便获取数据结束后做成功响应或失败响应 //所以DataRepository再实现DataFetcher.Callback接口 } 这里获取数据的执行者dataFetcher调用获取数据方法get(),实际放在DataRepository类里get数据也没问题,功能解藕更好些 update()方法被调用 ->执行者dataFetcher执行获取数据方法get() ->获取数据成功或失败, ->回调DataFetcher.Callback接口里方法getDataSuccess(), 或getDataError() @Override public void getDataSuccess(List<String> data) { isError = false; this.data = data; dispatchUpdate(); } @Override public void getDataError() { isError = true; dispatchUpdate(); } ->获取数据完毕,通知界面刷新 ->DataRepository继承BaseObservable类来调用dispatchUpdate()方法让AgeraDemo1View执行update()方法,而DataRepository需要实现Supplier<T>接口来暴露出获取数据的方法get(), @NonNull @Override public List<String> get() { //统一向外部提供数据的方法 return data; } 最后 class DataRepository extends BaseObservable implements Supplier<List<String>>, Updatable, DataFetcher.CallBack 而 两者间用DataRepository.addUpdatable(AgeraDemo1View)联系。
|
3、View界面刷新数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 第2步走完后,来到AgeraDemo1View的update()方法 @Override public void update() { swipeRefreshLayout.setRefreshing(false); if (dataRepository.isError()){ }else{ adapter.setData(dataRepository.get()); //从仓库里get()出数据 } } 到这一步,一个完整的Agera流程结束。
|
文章中的源码:https://github.com/zxos/MyApp
tag: Agera