媒体数据重构:
现状:
媒体数据就是指手机里的多媒体数据,比如图片,视频,音乐,在快影这个项目里使用的地方挺多,比如开始编辑前要启动相册来选图偏 或视频,编辑封面要选图片、编辑个人头像也要选图片,本地音乐里要选音乐,在项目里每个地方都有自己独立的实现,存在重复在代码,还有些实现逻辑有差异,比如有的有响应数据库的变化 有的没有,所以针对这种情况作了重构,
目的:
1、消除重复代码,统一逻辑;
2、对外提供统一 的调用接口;
3、接口能够快速响应;
具体措施:
1、对于各种类型的素材 音乐 视频 图片数据获取逻辑做抽想,抽取共同的逻辑到基类,基类包含的逻辑有 监控数据库变化、更新缓存数据、过滤缓存数据(根据路径过滤),具体的素材类 实现自己的query逻辑;
2、 抽想层次上音乐 视频 图片 是一个抽象层次,和相册不在一个层次上:
3、对外提供一个 MediaCacheFactory,MediaCacheFactory对外提供getMediaCache接口,根据不同的type返回对应的 CacheInstance;
4、在实现上每种cache对象都是一个单例,缓存数据保存在内存,保证数据能够及时返回;
5、更新数据的时候,对于数据量达到一屏的时候,提前返回部分数据,使页面能尽快展现;
部分实现:
1、监控数据库的变化,一旦有变化打个标签,但是不更新数据,只有下次数据流被监听的时候才更新,好处是数据并不保持实时更新,节省不必要的性能消耗,一旦被监听也能更新到最新的状态;
2、每种媒体数据都是一种数据流 Observable<Media>;
3、相册类里持有视频 和 图片的数据流,单独监听流的变化,再根据变化获取最新的数据来合成相册数据;
存在的问题:
1、只是对数据做了抽想,没有在 Ui层抽像,各处的 Ui 是自己实现的,在ui上也能抽取通用的代码,来封装成库给其他应用使用;
2、如果重新做的话 考虑viewModel + liveData ,liveData 能够自动管理生命周期,observable 需要自己去 dispose;