开源项目9GAG源码解析与Material改造(三)

来源:互联网 发布:建筑设计制图软件 编辑:程序博客网 时间:2024/06/06 21:40

前面两篇文章分别讲解了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也一直在更新,之前很难实现的效果,现在只要几行代码就搞定了,反倒是项目架构设计,网络通信,数据安全等方面的技术随着时间改变的少一些,这些也就是所谓的“核心技术”,也是一般的程序员和高级程序员的本质区别。各位同学,加油吧~

1 0
原创粉丝点击