前面两篇文章分别讲解了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改造(三)相关推荐

  1. BT开源项目Snark源码分析

    BT开源项目Snark源码分析 Snark是国外一个开源Java的项目,实现了BitTorrent协议,通过分析此项目的源程序,可以更利于我们更加深入的了解当前流行的BT软件的原理,进而可以指导我们的 ...

  2. 今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

  3. 开源项目实例源码_今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

  4. 鸿蒙开源源码,基于鸿蒙系统开源项目OpenHarmony源码静态分析

    #ifndef __scc #define __scc(X) ((long) (X)) // 转为long类型 typedef long syscall_arg_t; #endif #define _ ...

  5. Go实现的5G核心网开源项目free5gc源码分析系列 | Gopher Daily (2021.01.08) ʕ◔ϖ◔ʔ

    每日一谚:"Abstractions should be discovered, not created." Go技术新闻 Go实现的5G核心网开源项目free5gc源码分析系列 ...

  6. 【机器人学】机器人开源项目KDL源码学习:(5)KDL如何求解几何雅克比矩阵

    这篇文章试图说清楚两件事:1. 几何雅克比矩阵的本质:2. KDL如何求解机械臂的几何雅克比矩阵. 一.几何雅克比矩阵的本质 机械臂的关节空间的速度可以映射到执行器末端在操作空间的速度,这种映射可以通 ...

  7. 开源项目Telegram源码 Telegram for Android Source

    背景介绍 Telegram 是一款跨平台的即时通信软件,它的客户端是自由及开放源代码软件.用户可以相互交换加密与自毁消息,发送照片.影片等所有类型文件.官方提供手机版.桌面版和网页版等多种平台客户端. ...

  8. Spring源码深度解析(郝佳)-学习-源码解析-Spring MVC(三)-Controller 解析

    在之前的博客中Spring源码深度解析(郝佳)-学习-源码解析-Spring MVC(一),己经对 Spring MVC 的框架做了详细的分析,但是有一个问题,发现举的例子不常用,因为我们在实际开发项 ...

  9. 熔断器 Hystrix 源码解析 —— 命令执行(三)之执行超时

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Hystrix/command-execute-third-ti ...

  10. 区块链开源项目Asch源码初探

    Asch这个名字是 App Side Chain 的缩写. 是一种基于区块链跨链技术的应用开发平台,目前全部核心代码已经在GitHub上开源. 区块链是比特币的底层技术,但是名气低于比特币,但是个人认 ...

最新文章

  1. 工作9年开发面试华为要薪1W,华为员工:我司没有这么低工资的岗.....
  2. ASP.NET MVC – HTML 帮助器简介
  3. CopyCat 代码克隆检测发布,剑指开源软件抄袭
  4. 《从paxos到zookeeper》学习笔记(一)
  5. diy 扫地机器人 滚刷_霍尔传感器在扫地机器人中的作用
  6. 个性二维码开源专题液化/圆角/效果
  7. Celery介绍和使用
  8. python找不到指定的文件夹里_Python环球网在Unix中的指定文件路径中找不到*.txt
  9. hdu 1394 Minimum Inversion Number
  10. 获取ftp服务器的系统编码,ftp服务器编码问题
  11. Halcon教程三:了解基础算子
  12. Face2Face: Real-time Face Capture and Reenactment
  13. 搜索引擎的概念鄂州_搜索引擎的基本概念
  14. 随意切换双卡流量,立即获取对应卡的SMIS
  15. yolov3-tiny原始weights模型转onnx模型并进行推理
  16. 安装算量软件消火栓系统_识别其他设备
  17. Swift 函数的定义及调用
  18. netbackup基础知识
  19. 计算机网络层包括哪些设备,网络层的设备有哪些
  20. 单片机c语言1ms 2ms 4ms方波,第4章 7~10节 单片机C语言.ppt

热门文章

  1. Picgo typora error in repo name
  2. Criss-Cross Attention for Semantic Segmentation论文及代码分析
  3. OpenCV4 视频目标检测 场景文本检测 手写数字识别 案例
  4. 发那科程序全部输出_发那科CF卡程序输入输出方法
  5. 浪潮信息服务器哪个好,华为服务器和浪潮服务器哪个好?
  6. 中国天气网城市代码(全,已验证)
  7. 从零开始学《离散数学》-电子科技大学
  8. IOS苹果账号三方登录服务器端验证
  9. Windows10彻底关闭安全中心
  10. win10安装过程中一直卡在海内存知己天涯若比邻界面解决方法