读者可能会问:
- 为什么要使用AutoCache?
回答:简洁、高性能。- 现在市面上有那么多缓存的框架,像piccso等都很优秀,那笔者是不是在重复造车?
回答:AutoCache是为那些追求轻量级缓存的APP而生的。目的是让开发者既能快速完成APP缓存功能的开发,又能保证上线后性能的稳定。
1 API介绍
AutoCache 能够让你高效地编写app缓存代码 ,保证你的数据流被安全、准确地存储到SDcard私有目录。参考下列核心调用代码来开始你的 AutoCache 之旅:
1 | AutoCache.MediaCache.getInstance(context).asyncCache("url", new CallBack() { |
2 集成方法
在Module的build.gradle文件中添加如下依赖即可。
1 | compile 'com.txm.topcodes.autocache:autocache:0.1.2' |
3 调用方式
为方便开发者,AutoCache提供统一调用入口,调用方式十分简洁。下面先给大家看一张思维导图,该图罗列了框架的主体功能及其构成。
从结构图不难看出,AutoCache类就是调用框架的入口类。当我们需要从本地获取流文件时,调用方式是这样的
1 | AutoCache.Media.get…(); |
缓存网络文件时,调用方式是这样的
1 | AutoCache.MediaCache.getInstance(context).asyncCache(); |
缓存内存文件时,调用方式是这样的
1 | AutoCache.MediaCache.getInstance(context).cache(); |
当需要指定文件文件类型时,使用方式是这样的
1 | AutoCache.DIRECTORY_PICTURES |
「如需获取详细信息,请在 GitHub 的 auto-cache页面查看源代码.」
4 文件类型支持
AutoCache支持缓存以下泛媒体类型:Podcasts,Pictures,Movies,Music,Documents,Download。其中Download比较特殊,用它可以指定未知的文件类型。
5 使用场景
当我们的APP从网络获取文件流时,往往会有这样的需求「也可能是其中之一」:
- 网络请求时,要可以自动将文件保存到APP本地。
- 网络请求时,将网络图片的本地路径存储到SQLite或其它数据持久化中,以方便逻辑处理。
- 网络请求时,直接使用从网络获取到文件流。
- 网络请求时,方便添加进度条功能。
- 网络请求时,全局捕获异常。
- 本次请求之后,根据文件名、文件类型从本地获取文件流。
对于需求1。AutoCache完全是在后台IO线程中完成的,不需要调用者主动去操作。
IO线程:I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io线程比Thread线程更有效率。
对于需求2。save2DataBase(String cachePath)回调方法自动就被指定在IO线程中运行。「所以,save2DataBase既是一个非阻塞的方法,又具备IO线程的高效性。」
对于需求3。onSuccess(byte[] bytes)回调方法被指定自动运行在UI线程中。
对于需求4。AutoCache提供了onstart()回调方法作为调用开始的标志,onSuccess(byte[] bytes)或onErro(Throwable e)作为调用结束点。
对于需求5。全局捕获异常指的是:onErro(Throwable e)不仅可以捕获网络异常、本地缓存媒体时发生的异常,而且还可以捕获发生在onStart、save2DataBase、onSuccess中的异常。
对于需求6。AutoCache.Media类提供了4种同步方式来获取本地的媒体流。
6 最佳实践
6.1 防止OOM
AutoCache.Media类中提供了getSoftBmp(),getWeakBmp(),getBmp(),getFile()四种方式来获取流。如果是图片文件,笔者建议使用前两种方式,具体可参考善于利用软引用和弱引用。
6.2 定制回调方法
AutoCache框架提供了CallBackAdapter接口用于替换CallBack接口。可以通过它实现自由定制自己需要的回调方法。「这样是为了代码看上去简洁。」
1 | AutoCache.MediaCache.getInstance(context).asyncCache("url", new CallBackAdapter() { |
7 FAQ
我发现AutoCache还存在BUG?
AutoCache是一个完全开源的框架,如果您在使用过程中发现问题,请在GitHub创建一个问题。
我是Eclipse用户,可以使用AutoCache么?
不可以。
AutoCache用到了哪些第三方框架?
是的。AutoCache是在RXjava+Okhttp基础之上封装的一个轻量级缓存框架。
AutoCache提供缓存文件路径到SQLite数据库的方法了吗?
没有。AutoCache缓存的重心是将流文件缓存到本地目录。如果需要将文件路径缓存到SQLite或其他持久化数据层中,开发者需要自行在save2DataBase(cachePath)回调方法中实现逻辑。
我在android studio中链接AutoCache库失败了?
确保您的工程使用的远程仓库为jcenter。
1 | allprojects { |