Android8.1 推荐设计架构 基本示例代码分析。
直接整个简单的viewmodel加上一个livedata,屁都没测试出来。 还得看个完整的例子。
github地址在这 我们也可以在Android studio里面新建一个sample,最底下的选项。
这个软件最后的效果是这样。
挨个文件看:
AppExecutors 里边弄了几个线程池用来执行耗时的操作。通过getXXX方法就可以获得相应的池子。
BasicApp 这个是Application,新建的时候就初始化了线程池。还定义了类似于全局方法的两个方法可以获取database和datarepository
DataRepository 这个是获取数据用的,里边维护了一个products的list的livedata。 一个数据库实例,注意这个地方数据库是作为参数传进来的,在学习设计模式的时候一定要注意这些细节。 里边有一些方法:1.获取所有的产品,直接返回维护的list livedata 2.在数据库中load指定产品。3.在数据库中load指定的产品详情。
对我来说,里边最困惑的地方是这里:
mObservableProducts = new MediatorLiveData<>();
mObservableProducts.addSource(mDatabase.productDao().loadAllProducts(),
productEntities -> {
if (mDatabase.getDatabaseCreated().getValue() != null) {
mObservableProducts.postValue(productEntities);
}
});
所以要去查清楚!!
LiveData
subclass which may observe other LiveData
objects and react on OnChanged
events from them.
这句话直接说就是这个MediatoLiveData是LiveData的子类,他可以监控其他的livedata并且会在他们变化的时候调用onchanged回调。所以这里从数据库中加载了所有的产品,这个加载出来的是个livedata, 咱们这里的observableProducts就监控这个数据,如果这个数据变了,就把自己的指设为改变后的值。
接下来看看db文件夹下边的,这里边好说,我对Room还不大了解,但是这不妨碍去理解这个文件夹的结构。 对于appdatabase 要在里边使用线程创建数据库。 还hack了一把,用livedata<Boolean>来标志是否创建成功了。 这个数据库的整体接口没有太多,维护了两个Dao,可以通过一个事务去存储所有的数据。
我又想起来,这个repository里边获取数据为啥用个mediatorLivedata,因为一开始livedata里边没数据呀,没数据怎么去监控,应该是这么个问题,一会需要试一下。
其他的实例不看了,重点是查询的数据返回的都是LiveData。
看ViewModel ,这里的ProductViewModel 需要一个参数:application。 这里边用了一个databind的东西,这个暂时不管是什么了。 另外一个model里边参数更多,定义了一个Factory。 好多地方都说这个注入 Inject 好像是不需要参数就可以构造对象出来,让耦合度变的很低,这个要注意,不管早晚都要去看一下。
剩下的就是adapter 啥的。 好像也没啥东西,就是文档里边说的,但是就是能够正确的运行。 返回之前的mediatorlivedata的测试,先测试完这个吧。
是我蠢了,根本就没吧fragment放到栈里边去,事实证明livedata也是可以的。mediatorLivedata要分情况看待吧。这里数据库返回的也是livedata,我想看看数据库插入之后会不会引起数据的变化。
不敢相信,真的可以哎。 接下来有必要再来一波livedata的解析了。