目的:学习 在 setStateAsync 的使用。
在第4篇的基础上,把数据源改成耗时操作,setState 改成 setStateAsync。
从网络获取数据是最常见的需求,但一般都会将这种耗时操作放在子线程中执行,这样就涉及到线程切换,一般网络请求库都会封装为回调方法。 如果使用 RxJava,则变成链式的api,但依旧不够简单直接。 本框架内部直接代为处理了线程切换,并和生命周期绑定。
在中间显示 id 和 name。 点击屏幕后,触发刷新数据,3秒后获取到数据,并刷新UI。
复制入门教程4的中2个类 WidgetActivity
和 StatefulUserWidget
为了模拟网络请求,在 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);
}
这个时候需要用 setStateAsync
,这方法里面的操作都是放在子线程执行。
widget.onClickListener(v -> setStateAsync(() -> {
user = UserDataSource.getInstance().getUserFromRemote();
}));
这里简单介绍了 setStateAsync 的用法。 这或许是第2次让你感受到框架的强大之处。 What? 第一次是什么? 当然是 MVVM 的开发思想啦。
这个例子,其实还是有很大问题
- 比如点击之后,UI没有什么变化,等待了3秒才突然就刷新了数据,这样的用户体验是非常糟糕的。
- 另外用户很有可能因为等待时间过长,会不停的点击,造成频繁调用的数据源,开启多个线程,造成资源浪费。
这些我会在后面的进阶教程中解决。
到这里为止,你应该大致感受到了框架的便利之处,但也发现一些不尽人意的地方,但不要慌,后面还会有惊喜。