Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
74 lines (49 sloc) 3.3 KB

目的

目的:学习 AsyncState 的更新策略。

内容

在入门教程第7篇的基础上,稍作修改,避免多次点击重复请求。

简介

重复请求虽然不是什么大问题,但往往会造成资源浪费,客户端资源还好说,最多是多开了几个线程执行,但对于服务端来说,一个用户一次请求和3次请求是不一样的,如果所有的用户1次请求重复发3次,服务器就会增加3倍的压力。

效果

在中间显示 id 和 name。 点击屏幕后,触发刷新数据,3秒后获取到数据,并刷新UI。 在3秒内,无论点击多少次,都不会发出新的请求。

准备

复制入门教程7的中2个类 WidgetActivityStatefulUserWidget

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种策略可供选择: NotRepeatFilterStrategySingleTaskFilterStrategy

如果你有其他过滤需求,可以自己实现 FilterStrategy

null

空策略,也就是对于更新状态不做任何限制。

NotRepeatFilterStrategy

不重复策略,对于同一个 task,同一时间只能执行一个。 默认使用的就是该策略。

SingleTaskFilterStrategy

单通道策略,对于一个 StatefulWidget,同一时间内,只允许有一个更新 task 执行。

应用场景

  • null:一般用于同一个 task 需要同时执行的场景,比如写一个辅助去抢购商品(但一般也不会用安卓来写这种东西,逃 ( ﹁ ﹁ ) )。
  • NotRepeatFilterStrategy:适用于大部分场景。一般来说,一个页面,可能需要同时发起多个不同的请求,但对于同一种请求,同一时间最多一次。 就比如 正在加载详情数据的同时点击下单。
  • SingleTaskFilterStrategy:适用于同一时间只能有一个更新 task 执行的场景。

温馨提示

这些策略都是指在同一个 State 里面,Widget 不同,state 自然也不同。 这些策略可以在 createState 的时候指定。

对于 setState 来说,都是在主线程中执行,所以肯定是顺序执行的,不存在同时的概念,所以是不需要更新策略的,如果你对于同步的 setState 也有防止重复点击的需求,请自己在 onClickListener 中过滤重复点击。

总结

这里简单介绍了 State 的更新策略。 通过策略,可以的避免重复点击问题。

到这里为止,你大概可能似乎想使用本框架了吧(手动滑稽)。

下一节介绍 lcee + rm (也就是4中UI状态 + 下拉刷新和加载更多)

You can’t perform that action at this time.