开源项目9GAG源码解析与Material改造(三)
前面两篇文章分别讲解了9GAG中的UI布局和网络通信两个部分,本文重点讲解项目的最后一个部分——数据缓存,在APP的使用过程中好像感觉不到数据缓存的存在,但是如果没有数据缓存的话,项目的运行速度,耗电,流量等方面就会差很多。数据的缓存分为两个方面,一个是文本的缓存,一个是图片的缓存,下面分开进行讲解。
文本
9GAG的缓存策略是把请求的数据存入到本地数据库,每次展示的时候先查看本地的数据库有没有要展示的数据,如果有的话就直接显示出来,没有再去服务器请求。因为数据库的数据是动态更新的,这使得展示信息的ListView也需要动态的更新显示内容,因此使用了Loader, ContentProvider来动态维护数据库和List的展示。
相关的类
FeedsDBInfo
在网络通信的讲解中已经分析了Feed的数据结构,但是在数据的设计当中并不能直接把表设计成这个样子,因此需要重新设计一个类来对应数据库中表的结构,这就是FeedsDBInfo的作用。
DBHelper,BaseDataHelper和FeedsDataHelper
DBHelper是继承自SQLiteOpenHelper的类,负责新建和升级数据库。
FeedsDataHelper继承自BaseDataHelper,BaseDataHelper是一个对数据库操作的基类,里面有增删改查等操作(通过调用ContentProvider的方法)。FeedsDataHelper对应的是数据库中的Feed表,可以对Feed表进行增删改查操作。
有了BaseDataHelper之后,如果数据库中有了新的表,只需要新建一个类继承BaseDataHelper就可以了,方便了系统的扩展。
DataProvider
DataProvider继承自ContentProvider,实现了基本的增删改查(CRUD)操作,别忘记query()方法中在返回cursor前调用cursor.setNotificationUri(ContentResolver cr, Uri uri),在update/insert/delete方法中调用getContext().getContentResolver().notifyChange(uri, null)。
CursorLoader
CursorLoader是Loader的子类,每一个Activity和Fragment都可以获得Loader,他是用来提供异步的数据加载的。Loader的使用步骤:
1. 通过getLoaderManager().initLoader(0, null, this);来初始化Loader。
2. 实现LoaderManager.LoaderCallbacks。
onCreateLoader() — 初始化并且返回一个Loader
onLoadFinished() — 当Loader加载完成后调用
onLoaderReset() — 当Loader被重置时调用
为什么要这么做
也许你会疑惑,为什么要搞那么复杂,为什么要用ContentProvider,为什么要用Loader,直接对数据库操作不就好了。其实这么做主要为了两点:
1. 使用ContentProvider可以统一数据访问方式
2. 使用CursorLoader使ListView可以动态显示数据库中的数据,与数据库中的数据保持一致,而不用手动维护。(别忘了notifyChange)
图片
图片的缓存使用了两种方式,一种是缓存到内存中,读取写入都很快,但是一旦掉电就清空了,还有一种是缓存到Disc中,也就是手机的rom中,虽不如缓存到内存中快,但不易失。
相关的类
ImageCacheManager
原项目中使用了Volley进行图片加载和缓存,在ImageCacheManager中对加载的方法进行了封装和实现了一个ImageLoader.ImageListener。当然也可以使用Universal-Image-Loader进行图片的加载和缓存。
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisc(true).considerExifParams(true).build();ImageLoader.getInstance().displayImage(imageUrl, photoView, options, new SimpleImageLoadingListener() {
因为利用了开源项目,图片的缓存就变得非常简单了。
总结
到此为止,项目的三个大的部分:UI,网络数据传输,数据缓存就都讲解完了。目前市面上的APP开发主要涉及的也就是这三个部分,掌握了这三个部分一般的项目开发就可以依葫芦画瓢的做下去了。我个人觉得学习9GAG最主要的还是要学习他的设计模式和常用的开发技巧,UI次之,因为大众的审美一直在变,开源和官方关于UI的API也一直在更新,之前很难实现的效果,现在只要几行代码就搞定了,反倒是项目架构设计,网络通信,数据安全等方面的技术随着时间改变的少一些,这些也就是所谓的“核心技术”,也是一般的程序员和高级程序员的本质区别。各位同学,加油吧~
开源项目9GAG源码解析与Material改造(三)相关推荐
- BT开源项目Snark源码分析
BT开源项目Snark源码分析 Snark是国外一个开源Java的项目,实现了BitTorrent协议,通过分析此项目的源程序,可以更利于我们更加深入的了解当前流行的BT软件的原理,进而可以指导我们的 ...
- 今年我读了四个开源项目的源码,来分享下心得
今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...
- 开源项目实例源码_今年我读了四个开源项目的源码,来分享下心得
今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...
- 鸿蒙开源源码,基于鸿蒙系统开源项目OpenHarmony源码静态分析
#ifndef __scc #define __scc(X) ((long) (X)) // 转为long类型 typedef long syscall_arg_t; #endif #define _ ...
- Go实现的5G核心网开源项目free5gc源码分析系列 | Gopher Daily (2021.01.08) ʕ◔ϖ◔ʔ
每日一谚:"Abstractions should be discovered, not created." Go技术新闻 Go实现的5G核心网开源项目free5gc源码分析系列 ...
- 【机器人学】机器人开源项目KDL源码学习:(5)KDL如何求解几何雅克比矩阵
这篇文章试图说清楚两件事:1. 几何雅克比矩阵的本质:2. KDL如何求解机械臂的几何雅克比矩阵. 一.几何雅克比矩阵的本质 机械臂的关节空间的速度可以映射到执行器末端在操作空间的速度,这种映射可以通 ...
- 开源项目Telegram源码 Telegram for Android Source
背景介绍 Telegram 是一款跨平台的即时通信软件,它的客户端是自由及开放源代码软件.用户可以相互交换加密与自毁消息,发送照片.影片等所有类型文件.官方提供手机版.桌面版和网页版等多种平台客户端. ...
- Spring源码深度解析(郝佳)-学习-源码解析-Spring MVC(三)-Controller 解析
在之前的博客中Spring源码深度解析(郝佳)-学习-源码解析-Spring MVC(一),己经对 Spring MVC 的框架做了详细的分析,但是有一个问题,发现举的例子不常用,因为我们在实际开发项 ...
- 熔断器 Hystrix 源码解析 —— 命令执行(三)之执行超时
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Hystrix/command-execute-third-ti ...
- 区块链开源项目Asch源码初探
Asch这个名字是 App Side Chain 的缩写. 是一种基于区块链跨链技术的应用开发平台,目前全部核心代码已经在GitHub上开源. 区块链是比特币的底层技术,但是名气低于比特币,但是个人认 ...
最新文章
- 工作9年开发面试华为要薪1W,华为员工:我司没有这么低工资的岗.....
- ASP.NET MVC – HTML 帮助器简介
- CopyCat 代码克隆检测发布,剑指开源软件抄袭
- 《从paxos到zookeeper》学习笔记(一)
- diy 扫地机器人 滚刷_霍尔传感器在扫地机器人中的作用
- 个性二维码开源专题液化/圆角/效果
- Celery介绍和使用
- python找不到指定的文件夹里_Python环球网在Unix中的指定文件路径中找不到*.txt
- hdu 1394 Minimum Inversion Number
- 获取ftp服务器的系统编码,ftp服务器编码问题
- Halcon教程三:了解基础算子
- Face2Face: Real-time Face Capture and Reenactment
- 搜索引擎的概念鄂州_搜索引擎的基本概念
- 随意切换双卡流量,立即获取对应卡的SMIS
- yolov3-tiny原始weights模型转onnx模型并进行推理
- 安装算量软件消火栓系统_识别其他设备
- Swift 函数的定义及调用
- netbackup基础知识
- 计算机网络层包括哪些设备,网络层的设备有哪些
- 单片机c语言1ms 2ms 4ms方波,第4章 7~10节 单片机C语言.ppt