框架使用系列《一》 -Agera

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