当前位置:   article > 正文

java mvvm框架实例_安卓开发:基于MVVM设计模式,利用RxJava和Room打造数据请求框架...

android rxjava mvvm 判断网络状态

在实际安卓开发中,很多开发经验不是很丰富的开发者对于数据请求的处理就是简单的从服务器获取,没有网络便无法显示数据。这种做法虽然省事但却带来了很不好的用户体验,一方面空白页面看起来内容空洞,另一方面持续的网络请求会消耗不必要的流量和电量。

b0ae5d1ad0083171c83d55c511ca6f6e.png

其实也有很多开源库可以帮助我们在请求的时候做一些缓存,最经典的莫过了官方提供的Jetpack库中Room相关的Api的了。不过在实际使用中还是有开发者觉得不方便,那么这篇文章就来介绍如何基于MVVM设计模式并利用RxJava和Room打造全新数据请求框架,它的基本架是这样的。

dea6fc70bdbca2f73ba3ef35d2d2947a.png

repository层中数据的流向是由 PersistableNetworkResourceCall(以下简称PNRC)类来协调的。

2346574504ee132ccae1c25050498148.png

注意的是,这里的ResponseType是从网络获得的DTO(数据传输对象)类型,而ResourceType是在本地存储并发送给任何观察者(如ViewModels)的本地模型的数据类型,ResponseType和ResourceType类型可能是一样的。

b755f09748fd5795ba2b7ed6d95763d9.png

检索数据和处理网络请求的回调的实现细节可以交给repository类来处理。值得一提的是,NeworkResourceCall中像登录请求这样并不需要从本地加载数据。

说完概念以后,下面通过一个简单的示例把这个框架的用户法讲一下。在这个应用程序中,演示了导航和加载数据列表的交互流程。Item由Job实体表示,下面我们来看一下Job是如何在屏幕上加载和显示在列表的,以及如果列表为空或者网络请求失败会发生什么,大体为为以下几个步骤。

b054e2661010523505e23b8630581078.png

用户启动应用程序,JobsActivity被创建。在JobsActivity.onCreate()方法中,JobsViewModel完成初始化并且JobsViewModel的loading、error、noJobsFound以及presentationLiveDatas方法被监听,JobsViewModel.bind()被调用。JobsViewModel.bind()的调用会导致JobsViewModel订阅JobRepository.getJobs()方法。在JobRepository.getJobs()实例化了一个PNRC对象,PNRC创建一个Observable,向其所有观察者(JobsViewModel)发出一个值为null的Loading状态,并尝试从Room数据库中加载Job数据 。由于初始状态下没有任何数据可以显示,JobsViewModel便发送了一个loading为true的SingleLiveEvent事件,告诉JobsActivity应该显示进度条。当数据库查询完成时,PNRC将发出另一个Loading状态,其中包含从数据库查询返回的数据,然后调用Web API以尝试从网络获取新数据。如果来自数据库查询的数据不是null的话,JobsViewModel便通过JobWithRelations List并且把这个Presentation对象设置到presentation LiveData中。当网络请求完成时,PNRC将发出以下三种状态之一:如果请求成功,则ResourceFound使用非null数据(2xx HTTP状态代码),并且响应包含非空或空的资源;如果请求成功,则NoResourceFound使用null数据,但资源为null或为空;如果请求失败(非2xx HTTP状态代码)则Error用自定义data.core.Error对象。如果状态是ResourceFound,JobsRepository负责转换JobResponse的DTO到Job和Worker实体,并且用适当的DAO接口插入或更新Job和Worker到数据库。如果状态为NoResourceFound,则JobsRepository发出一个NoResourceFound状态,JobsViewModel通知其noJobsFound LiveData并JobsActivity隐藏RecyclerView并显示空状态View以通知用户未找到任何活jobs。在存储库和数据源层中使用Rx Observables而不是LiveData,因为这些层不需要生命周期感知,并Observables提供更多用于转换和准备数据的功能。

10636259d6def8a059f5e9f427e7e203.png

相信看完了上面这个例子,大家对使用RxJava和Room打造全新的请求框架应该用些思路,不妨亲自动手实践一番吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/300884
推荐阅读
相关标签
  

闽ICP备14008679号