使用 MVI 编写响应式 APP — 第六部分 — 状态恢复,成功收获美团、小米安卓offer

本文探讨了在使用ModelViewIntent(MVI)架构开发Android应用时,如何处理状态的序列化、反序列化和恢复问题,尤其是在Activity被销毁后如何避免丢失数据加载逻辑。作者强调了状态管理的重要性,以及为何在某些情况下选择内存存储而非持久化到bundle,并提到了Service和RxJava在处理进程死亡时的潜在作用。
摘要由CSDN通过智能技术生成

@Override
public void render(MyState state) {
lastState = state;
… // update UI widgets
}

@Override
public void onSaveInstanceState(Bundle out){
out.putParcelable(KEY_STATE, lastState);
}

@Override
public void onCreate(Bundle saved){
super.onCreate(saved);
MyViewState initialState = null;
if (saved != null){
initialState = saved.getParcelable(KEY_STATE);
}

presenter = new MyPresenter( new MyStateReducer(initialState) ); // With dagger: new MyDaggerModule(initialState)
}

}

我知道你已经掌握了要点。请注意在 onCreate() 方法中我们不能直接调用 view.render(state),取而代之,我们应该让初始化状态下沉到状态管理的地方:状态折叠器(看第三部分)在这里我们用 .scan(initialState,reducerFunction)

结论

随着单向数据流和一个 Model 代表一种状态,很多与状态相关的事情,变得相对于其他的模式更加简单。然而,通常在我的 APP 中,我不会持久化状态到 bundle 有以下两点原因:第一, Bundle 有大小限制,因此你不能存很大的状态在 bundle 中(相反,你需要存储状态到文件,或者,存储到对象存储例如 Realm)。第二,我们仅仅讨论了如何去序列化和反序列化,但是,这不一定与恢复状态相同。

例子:让我们假设我们有一个 LCE(Loading-Content-Error) 的 view,这个 view 在加载数据时会显示一个指示器,并且当数据加载完成后会展示一个列表视图。。因此,这个状态应当是 MyViewState.LOADING。让我们假设加载需要消耗一定的时间,就在加载时候,Activity 进程也被杀掉了(例如,因为其他应用程序占据了前台,像电话 app 因为女票的电话而占据了前台)。如果如之前所述,我们仅仅只是序列化了 MyViewState.LOADING 这个状态,并在 Activity 被重新创建时反序列化它,那么我们的状态折叠器只会去调用 view.render(MyViewState.LOADING) 。注意到目前为止一切都还好,但是接下来我们会发现去加载数据本身这个操作(发起一次 http 请求)永远不会执行。这就是盲目简单地反序列化带来的结果。

正如你所见, 序列化与反序列化状态,并不同于状态恢复。状态恢复也许需要一些添加额外的一些会增加复杂性的步骤(使用 MVI 来实现比我目前为止所使用的任何其他架构更加简单)。当 view 被重新创建的时候,反序列化状态也许包含了一些过期数据。因此,你需要想尽办法更新数据。在大多数 app 中,我通过努力找到了一种更简单和更加友好的方法,仅仅保持状态到内存中。并且当进程死亡的时候,开启一个空的初始化状态就像 app 第一次启动一样。理想情况下一个 app 有缓存和离线支持,因此当进程死亡,重新加载数据是很快的。

这最终导致我与其他安卓开发者都争论过一个问题:如果我使用了缓存或者存储,那么我就已经拥有了一个独立于安卓生命周期之外的组件,我也不再需要去处理相关的状态缓存问题,MVI 完全就是在胡说嘛!对么? 大多数这些安卓开发者推荐 Mike Nakhimovich 发表的Presenter 不是为了持久化这篇文章介绍的 NyTimes Store,一个数据加载和缓存库。不幸的是,这些这些开发者不理解加载数据和缓存不是状态管理。例如,如果我不得不从两个缓存或存储中加载数据呢?

最后,像 NyTimes 缓冲库帮助我们处理进程死亡了么?很显然没有,因为进程死亡随时可能发生。为来解决这个问题,我们能做的仅仅是乞求安卓操作系统不要杀死我们的 app 进程,因为我们依旧需要做一些工作通过安卓的 service (这个组件也是独立于其他安卓组件的生命周期)或者我们现在用 rxjava 来取代 service,我们可以这样么?我们讨论关于安卓的 service,rxjava 和 MVI 在下一部分。敬请期待(๑˙ー˙๑)。

剧透: 我认为我们需要 service。

这篇博客是 "用 MVI 开发响应式App"中的一篇博客。下面是内容表:

总结

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

详细整理在GitHub可以见;

Android架构视频+BAT面试专题PDF+学习笔记

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)**
[外链图片转存中…(img-WsP5GWHm-1711005748767)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值