目的:学习 AsyncState 的更新策略。
在入门教程第7篇的基础上,稍作修改,避免多次点击重复请求。
重复请求虽然不是什么大问题,但往往会造成资源浪费,客户端资源还好说,最多是多开了几个线程执行,但对于服务端来说,一个用户一次请求和3次请求是不一样的,如果所有的用户1次请求重复发3次,服务器就会增加3倍的压力。
在中间显示 id 和 name。 点击屏幕后,触发刷新数据,3秒后获取到数据,并刷新UI。 在3秒内,无论点击多少次,都不会发出新的请求。
复制入门教程7的中2个类 WidgetActivity
和 StatefulUserWidget
之前 setStateAsync
中的对象,都是每次点击都 new 一个新的,实际上,里面的代码是固定的,可以抽成一个成员变量。
private Runnable updateTask = () -> {
user = UserDataSource.getInstance().getUserFromRemote();
};
@Override
public void initWidget(LinearWidget widget) {
widget
.orientation(LinearWidget.vertical)
.gravity(Gravity.CENTER)
.matchParent()
.onClickListener(v -> setStateAsync(updateTask));
}
改成成员变量后,无论怎么点击,同时只能发出一次请求,在结束之前,其他点击都会被忽略。
这其实是用了 State 内部的默认更新策略。
库中默认提供了2种策略可供选择: NotRepeatFilterStrategy
、SingleTaskFilterStrategy
如果你有其他过滤需求,可以自己实现 FilterStrategy
空策略,也就是对于更新状态不做任何限制。
不重复策略,对于同一个 task,同一时间只能执行一个。 默认使用的就是该策略。
单通道策略,对于一个 StatefulWidget,同一时间内,只允许有一个更新 task 执行。
- null:一般用于同一个 task 需要同时执行的场景,比如写一个辅助去抢购商品(但一般也不会用安卓来写这种东西,逃 ( ﹁ ﹁ ) )。
- NotRepeatFilterStrategy:适用于大部分场景。一般来说,一个页面,可能需要同时发起多个不同的请求,但对于同一种请求,同一时间最多一次。 就比如 正在加载详情数据的同时点击下单。
- SingleTaskFilterStrategy:适用于同一时间只能有一个更新 task 执行的场景。
这些策略都是指在同一个 State
里面,Widget 不同,state 自然也不同。 这些策略可以在 createState
的时候指定。
对于 setState
来说,都是在主线程中执行,所以肯定是顺序执行的,不存在同时的概念,所以是不需要更新策略的,如果你对于同步的 setState
也有防止重复点击的需求,请自己在 onClickListener 中过滤重复点击。
这里简单介绍了 State
的更新策略。 通过策略,可以的避免重复点击问题。
到这里为止,你大概可能似乎想使用本框架了吧(手动滑稽)。
下一节介绍 lcee + rm (也就是4中UI状态 + 下拉刷新和加载更多)