Skip to content

Latest commit

 

History

History
62 lines (42 loc) · 2.21 KB

7.setStateAsync.md

File metadata and controls

62 lines (42 loc) · 2.21 KB

目的

目的:学习 在 setStateAsync 的使用。

内容

在第4篇的基础上,把数据源改成耗时操作,setState 改成 setStateAsync。

简介

从网络获取数据是最常见的需求,但一般都会将这种耗时操作放在子线程中执行,这样就涉及到线程切换,一般网络请求库都会封装为回调方法。 如果使用 RxJava,则变成链式的api,但依旧不够简单直接。 本框架内部直接代为处理了线程切换,并和生命周期绑定。

效果

在中间显示 id 和 name。 点击屏幕后,触发刷新数据,3秒后获取到数据,并刷新UI。

准备

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

UserDataSource

为了模拟网络请求,在 UserDataSource 中增加一个方法 getUserFromRemote,里面休眠3秒,来模拟网络请求。

    public UserBean getUserFromRemote() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        int id = randomId();
        String name = randomName();
        return new UserBean(id, name);
    }

StatefulUserWidget

这个时候需要用 setStateAsync,这方法里面的操作都是放在子线程执行。

    widget.onClickListener(v -> setStateAsync(() -> {
        user = UserDataSource.getInstance().getUserFromRemote();
    }));

总结

这里简单介绍了 setStateAsync 的用法。 这或许是第2次让你感受到框架的强大之处。 What? 第一次是什么? 当然是 MVVM 的开发思想啦。

这个例子,其实还是有很大问题

  1. 比如点击之后,UI没有什么变化,等待了3秒才突然就刷新了数据,这样的用户体验是非常糟糕的。
  2. 另外用户很有可能因为等待时间过长,会不停的点击,造成频繁调用的数据源,开启多个线程,造成资源浪费。

这些我会在后面的进阶教程中解决。

到这里为止,你应该大致感受到了框架的便利之处,但也发现一些不尽人意的地方,但不要慌,后面还会有惊喜。