afinalcache能filecache可以删除吗吗

afinal-master SCM 单片机开发 238万源代码下载-
&文件名称: afinal-master
& & & & &&]
&&所属分类:
&&开发工具: Java
&&文件大小: 3447 KB
&&上传时间:
&&下载次数: 0
&&提 供 者:
&详细说明:afinal Framework application source code
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&afinal-master&&.............\README.md&&.............\bin&&.............\...\afinal-0.2-bin.jar&&.............\...\afinal-0.2.1-bin.jar&&.............\...\afinal-0.3.1-bin.jar&&.............\...\afinal-0.3.2-bin.jar&&.............\...\afinal-0.3.3-bin.jar&&.............\...\afinal-0.3.31-bin.jar&&.............\...\afinal-0.3.32-bin.jar&&.............\...\afinal_0.5.1_bin.jar&&.............\...\afinal_0.5_bin.jar&&.............\doc&&.............\...\afinal-0.2-change log.txt&&.............\...\afinal-0.3-change log.txt&&.............\...\afinal-0.3-doc.zip&&.............\...\afinal-0.3.1-doc.zip&&.............\...\afinal-0.3.2-doc.zip&&.............\...\afinal-0.3.3-doc.zip&&.............\...\afinal-0.3.32-doc.zip&&.............\src&&.............\...\net&&.............\...\...\tsz&&.............\...\...\...\afinal&&.............\...\...\...\......\FinalActivity.java&&.............\...\...\...\......\FinalBitmap.java&&.............\...\...\...\......\FinalDb.java&&.............\...\...\...\......\FinalHttp.java&&.............\...\...\...\......\annotation&&.............\...\...\...\......\..........\sqlite&&.............\...\...\...\......\..........\......\Id.java&&.............\...\...\...\......\..........\......\ManyToOne.java&&.............\...\...\...\......\..........\......\OneToMany.java&&.............\...\...\...\......\..........\......\Property.java&&.............\...\...\...\......\..........\......\Table.java&&.............\...\...\...\......\..........\......\Transient.java&&.............\...\...\...\......\..........\view&&.............\...\...\...\......\..........\....\EventListener.java&&.............\...\...\...\......\..........\....\Select.java&&.............\...\...\...\......\..........\....\ViewInject.java&&.............\...\...\...\......\bitmap&&.............\...\...\...\......\......\core&&.............\...\...\...\......\......\....\BaseMemoryCacheImpl.java&&.............\...\...\...\......\......\....\BitmapCache.java&&.............\...\...\...\......\......\....\BitmapDecoder.java&&.............\...\...\...\......\......\....\BitmapDisplayConfig.java&&.............\...\...\...\......\......\....\BitmapProcess.java&&.............\...\...\...\......\......\....\BytesBufferPool.java&&.............\...\...\...\......\......\....\DiskCache.java&&.............\...\...\...\......\......\....\IMemoryCache.java&&.............\...\...\...\......\......\....\LruMemoryCache.java&&.............\...\...\...\......\......\....\SoftMemoryCacheImpl.java&&.............\...\...\...\......\......\display&&.............\...\...\...\......\......\.......\Displayer.java&&.............\...\...\...\......\......\.......\SimpleDisplayer.java&&.............\...\...\...\......\......\download&&.............\...\...\...\......\......\........\Downloader.java&&.............\...\...\...\......\......\........\SimpleDownloader.java&&.............\...\...\...\......\core&&.............\...\...\...\......\....\AbstractCollection.java&&.............\...\...\...\......\....\ArrayDeque.java&&.............\...\...\...\......\....\Arrays.java&&.............\...\...\...\......\....\AsyncTask.java&&.............\...\...\...\......\....\Deque.java&&.............\...\...\...\......\....\FileNameGenerator.java&&.............\...\...\...\......\....\Queue.java&&.............\...\...\...\......\db&&.............\...\...\...\......\..\sqlite&&.............\...\...\...\......\..\......\CursorUtils.java&&.............\...\...\...\......\..\......\DbModel.java&&.............\...\...\...\......\..\......\ManyToOneLazyLoader.java&&.............\...\...\...\......\..\......\OneToManyLazyLoader.java&&.............\...\...\...\......\..\......\SqlBuilder.java&&.............\...\...\...\......\..\......\SqlInfo.java&&.............\...\...\...\......\..\table&&.............\...\...\...\......\..\.....\Id.java&&.............\...\...\...\......\..\.....\KeyValue.java&&.............\...\...\...\......\..\.....\ManyToOne.java&&.............\...\...\...\......\..\.....\OneToMany.java&&.............\...\...\...\......\..\.....\Property.java&&.............\...\...\...\......\..\.....\TableInfo.java&&.............\...\...\...\......\exception&&.............\...\...\...\......\.........\AfinalException.java&&.............\...\...\...\......\.........\DbException.java&&.............\...\...\...\......\.........\HttpException.java&&.............\...\...\...\......\.........\ViewException.java&&.............\...\...\...\......\http&&.............\...\...\...\......\....\AjaxCallBack.java&&.............\...\...\...\......\....\AjaxParams.java&&.............\...\...\...\......\....\HttpHandler.java&&.............\...\...\...\......\....\MultipartEntity.java&&.............\...\...\...\......\....\PreferencesCookieStore.java&&.............\...\...\...\......\....\RetryHandler.java&&.............\...\...\...\......\....\SyncRequestHandler.java&&.............\...\...\...\......\....\entityhandler&&.............\...\...\...\......\....\.............\EntityCallBack.java&&.............\...\...\...\......\....\.............\FileEntityHandler.java&&.............\...\...\...\......\....\.............\StringEntityHandler.java&&.............\...\...\...\......\utils&&.............\...\...\...\......\.....\ClassUtils.java
&输入关键字,在本站238万海量源码库中尽情搜索:当前访客身份:游客 [
拥有积分:3
这家伙太懒,还没有签名!
解答题中心
android轻量级开源缓存框架&&ASimpleCache(ACache)源码分析
( 16:12:53) &|
&评论(0)&&|
&阅读次数(2293)|
人收藏此文章,
转载请注明出处:
ASimpleCache框架源码链接
杨神作品,大家最熟悉他的应该是afinal框架吧
ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。
1、它可以缓存什么东西?
普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 byte数据。
2、它有什么特色?
特色主要是:
1:轻,轻到只有一个JAVA文件。
2:可配置,可以配置缓存路径,缓存大小,缓存数量等。
3:可以设置缓存超时时间,缓存超时自动失效,并被删除。
4:支持多进程。
3、它在android中可以用在哪些场景?
1、替换SharePreference当做配置文件
2、可以缓存网络请求数据,比如oschina的android客户端可以缓存http请求的新闻内容,缓存时间假设为1个小时,超时后自动失效,让客户端重新请求新的数据,减少客户端流量,同时减少服务器并发量。
3、您来说…
4、如何使用 ASimpleCache?
以下有个小的demo,希望您能喜欢:
ACache mCache = ACache.get(this)
mCache.put("test_key1", "test value")
mCache.put("test_key2", "test value", 10)
mCache.put("test_key3", "test value", 2 * ACache.TIME_DAY)
ACache mCache = ACache.get(this);
String value = mCache.getAsString("test_key1");
一、ACache类结构图
ASimpleCache里只有一个JAVA文件——ACache.java
首先我用思维导图制作了ACache类的详细结构图:
二、官方demo分析
通过分析官方给的demo来驱动源码分析吧
以字符串存储为例(官方给的demo里给出了很多种数据读取的例子,其实方法相似),打开SaveStringActivity.java:
package com.yangfuhai.
import org.afinal.simplecache.AC
import android.app.A
import android.os.B
import android.view.V
import android.widget.EditT
import android.widget.TextV
import android.widget.T
/** * *: SaveStringActivity *: 缓存string * Yoson Hao *
下午9:59:43 * */
public class SaveStringActivity extends Activity {
private EditText mEt_string_
private TextView mTv_string_
private ACache mC
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_save_string);
initView();
mCache = ACache.get(this);
/** * 初始化控件 */
private void initView() {
mEt_string_input = (EditText) findViewById(R.id.et_string_input);
mTv_string_res = (TextView) findViewById(R.id.tv_string_res);
/** * 点击save事件 * * v */
public void save(View v) {
if (mEt_string_input.getText().toString().trim().length() == 0) {
Toast.makeText(
"Cuz u input is a nullcharacter ... So , when u press \"read\" , if do not show any result , plz don't be surprise",
Toast.LENGTH_SHORT).show();
mCache.put("testString", mEt_string_input.getText().toString(),300);
/** * 点击read事件 * * v */
public void read(View v) {
String testString = mCache.getAsString("testString");
if (testString == null) {
Toast.makeText(this, "String cache is null ...", Toast.LENGTH_SHORT)
mTv_string_res.setText(null);
mTv_string_res.setText(testString);
/** * 点击clear事件 * * v */
public void clear(View v) {
mCache.remove("testString");
可以看到缓存字符串的读取方法很简单!!!
在onCreate里通过get方式获取缓存实例
mCache = ACache.get(this);
在save按钮的点击事件里,通过put方法往缓存实例里保存字符串
mCache.put(“testString”, mEt_string_input.getText().toString(),300);
在read按钮的点击事件里,通过getAsString方法从缓存实例里读取字符串
mCache.getAsString(“testString”);
其他数据读取,方法相似,也是这三个步骤。300为保存时间300秒。
三、ACache源码分析
1、获取缓存实例
那我们就从ACache.get()开始吧,其实查看上面的思维导图,ACache类的构造方法为private的,所以新建缓存实例只能通过ACache.get方式获取。
public static ACache get(Context ctx) {
return get(ctx, "ACache");
public static ACache get(Context ctx, String cacheName) {
File f = new File(ctx.getCacheDir(), cacheName);
return get(f, MAX_SIZE, MAX_COUNT);
public static ACache get(File cacheDir, long max_zise, int max_count) {
ACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid());
if (manager == null) {
manager = new ACache(cacheDir, max_zise, max_count);
mInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);
在调用ACache.get(Context)方法过程中,其实执行了三个get方法
(1)get(Context ctx)-&(2)get(Context ctx, String cacheName)-&(3)get(File cacheDir, long max_zise, int max_count)
在(2)中新建了缓存目录,路径为:
/data/data/app-package-name/cache/ACache
缓存大小MAX_SIZE和数量MAX_COUNT均由final变量控制。
其实最终调用(3)获取实例:
mInstanceMap的key为缓存目录+每次应用开启的进程id,value为ACache.
初次运行,mInstanceMap没有任何键值对,所以manager == null。故通过ACache构造方法构造新实例,最后将该实例引用存入mInstanceMap。
接下来我们来看看ACache构造方法:
private ACache(File cacheDir, long max_size, int max_count) {
if (!cacheDir.exists() && !cacheDir.mkdirs()) {
throw new RuntimeException("can't make dirs in " + cacheDir.getAbsolutePath());
mCache = new ACacheManager(cacheDir, max_size, max_count);
缓存目录不存在并且无法创建时,抛出异常,否则实例化ACacheManager内部类实例(缓存管理器)。ACacheManager内部类的构造函数如下:
private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {
this.cacheDir = cacheD
this.sizeLimit = sizeL
this.countLimit = countL
cacheSize = new AtomicLong();
cacheCount = new AtomicInteger();
calculateCacheSizeAndCacheCount();
构造函数得到原子类实例cacheSize和cacheCount,通过calculateCacheSizeAndCacheCount();方法计算cacheSize和cacheCount如下:
/** * 计算 cacheSize和cacheCount */
private void calculateCacheSizeAndCacheCount() {
new Thread(new Runnable() {
public void run() {
long size = 0;
int count = 0;
File[] cachedFiles = cacheDir.listFiles();
if (cachedFiles != null) {
for (File cachedFile : cachedFiles) {
size += calculateSize(cachedFile);
count += 1;
lastUsageDates.put(cachedFile, cachedFile.lastModified());
cacheSize.set(size);
cacheCount.set(count);
}).start();
calculateCacheSizeAndCacheCount方法中开启线程进行大小和数量的计算。计算完后存入cacheSize和cacheCount,cacheSize和cacheCount在内部类中定义为AtomicLong和AtomicInteger量子类,也就是线程安全的。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入。
到这里获取缓存实例工作完成,主要完成了如下工作:
新建了缓存目录
通过ACache构造方法构造新实例,并且将该实例引用插入mInstanceMap
实例化ACacheManager,计算cacheSize和cacheCount
接下来就是数据存取操作。
2、往缓存实例存入数据
从上面的思维导图public method(各种数据的读写方法)中,有各种public的put和get等方法来缓存各种数据类型的数据。由上面的demo的put方法
mCache.put(“testString”, mEt_string_input.getText().toString(),300);我们找到原形:
/** * 保存 String数据 到 缓存中 * * key * 保存的key * value * 保存的String数据 * saveTime * 保存的时间,单位:秒 */
public void put(String key, String value, int saveTime) {
put(key, Utils.newStringWithDateInfo(saveTime, value));
这里的put方法可以指定缓存时间。调用他自身的另一个put方法:
/** * 保存 String数据 到 缓存中 * * key * 保存的key * value * 保存的String数据 */
public void put(String key, String value) {
File file = mCache.newFile(key);
BufferedWriter out = null;
out = new BufferedWriter(new FileWriter(file), 1024);
out.write(value);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
mCache.put(file);
在put(String key, String value)方法中首先调用mCache.newFile(key)新建一个文件:
private File newFile(String key) {
return new File(cacheDir, key.hashCode() + "");
新建的文件名为key的整型哈希码。回到put(String key, String value)中,然后通过out.write(value);将数据存入文件。最后调用mCache.put(file);进行ACacheManager实例的更新操作:
private void put(File file) {
int curCacheCount = cacheCount.get();
while (curCacheCount + 1 & countLimit) {
long freedSize = removeNext();
cacheSize.addAndGet(-freedSize);
curCacheCount = cacheCount.addAndGet(-1);
cacheCount.addAndGet(1);
long valueSize = calculateSize(file);
long curCacheSize = cacheSize.get();
while (curCacheSize + valueSize & sizeLimit) {
long freedSize = removeNext();
curCacheSize = cacheSize.addAndGet(-freedSize);
cacheSize.addAndGet(valueSize);
Long currentTime = System.currentTimeMillis();
file.setLastModified(currentTime);
lastUsageDates.put(file, currentTime);
分析完ACacheManager的put()后,我们回到put(key, Utils.newStringWithDateInfo(saveTime, value))
其中第二个参数value传入的是Utils.newStringWithDateInfo(saveTime, value),而newStringWithDateInfo是ACache的内部工具类的一个方法,在value内容前面加上了时间信息:
private static String newStringWithDateInfo(int second, String strInfo) {
return createDateInfo(second) + strI
返回拼接createDateInfo(second)和value的字符串。createDateInfo()如下:
private static String createDateInfo(int second) {
String currentTime = System.currentTimeMillis() + "";
while (currentTime.length() & 13) {
currentTime = "0" + currentTime;
return currentTime + "-" + second + mS
返回字符串格式为 当前时间-保存时间“ ”
3、从缓存实例读取数据
由上面的demo的get方法mCache.getAsString(“testString”);我们找到原形:
/** * 读取 String数据 * * key * String 数据 */
public String getAsString(String key) {
File file = mCache.get(key);
if (!file.exists())
return null;
boolean removeFile = false;
BufferedReader in = null;
in = new BufferedReader(new FileReader(file));
String readString = "";
String currentL
while ((currentLine = in.readLine()) != null) {
readString += currentL
if (!Utils.isDue(readString)) {
return Utils.clearDateInfo(readString);
removeFile = true;
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (in != null) {
in.close();
} catch (IOException e) {
e.printStackTrace();
if (removeFile)
remove(key);
getAsString(String key)方法里首先通过缓存管理器的mCache.get(key)方法获取文件,然后用Utils.isDue(readString)**判断是否字符串数据到期,未到期返回去除时间信息的字符串内容;到期则移除缓存,返回空。**Utils.isDue(readString)调用了isDue(byte[] data)判断:
/** * 判断缓存的byte数据是否到期 * * data * true:到期了 false:还没有到期 */
private static boolean isDue(byte[] data) {
String[] strs = getDateInfoFromDate(data);
if (strs != null && strs.length == 2) {
String saveTimeStr = strs[0];
while (saveTimeStr.startsWith("0")) {
saveTimeStr = saveTimeStr.substring(1, saveTimeStr.length());
long saveTime = Long.valueOf(saveTimeStr);
long deleteAfter = Long.valueOf(strs[1]);
if (System.currentTimeMillis() & saveTime + deleteAfter * 1000) {
return true;
return false;
至此整个缓存字符串读取过程在ACache的源码分析完成,其他缓存数据类型读取方法分析过程一样。
JsonObject、JsonArray、Bitmap、Drawable、序列化的存入缓存都是转化为字符串/byte格式,再调用函数put(String key, String value)即可。
比如BitMap的保存:
/** * 保存 bitmap 到 缓存中,有保存时间 * * key * 保存的key * value * 保存的 bitmap 数据 * saveTime * 保存的时间,单位:秒 */
public void put(String key, Bitmap value, int saveTime) {
put(key, Utils.Bitmap2Bytes(value), saveTime);
Bitmap的读取:
/** * 读取 bitmap 数据 * * key * bitmap 数据 */
public Bitmap getAsBitmap(String key) {
if (getAsBinary(key) == null) {
return null;
return Utils.Bytes2Bimap(getAsBinary(key));
思想就是把bitmap转化为byte[], 再调用缓存byte的函数 。通过Utils.Bitmap2Bytes(value)完成Bitmap → byte[] 的转换。通过Utils.Bytes2Bimap(getAsBinary(key))完成byte[] → Bitmap的转换。
private static byte[] Bitmap2Bytes(Bitmap bm) {
if (bm == null) {
return null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.pressFormat.PNG, 100, baos);
return baos.toByteArray();
private static Bitmap Bytes2Bimap(byte[] b) {
if (b.length == 0) {
return null;
return BitmapFactory.decodeByteArray(b, 0, b.length);
很简单吧。Drawable的缓存就是先转化为Bitmap,之后就是上面的步骤转换成byte。
该开源库类简单,容易理解。
可以使用ACache把那些不需要实时更新的数据缓存起来,一来减少网络请求,二来本地加载速度也快。
可以设置缓存时间。
可以替换SharePreference当做配置文件,保存多种数据类型,比如可以保存头像信息。
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:(#换为@))Afinal 0.3.3发布,Android快速开发框架-红联Linux系统门户
您的位置:
&& 查看内容 - - -
Afinal 0.3.3发布,Android快速开发框架
empast发布于
&&字号: &&&&(网友评论&1&条)&
afinal0.3.3 发布了,源码已经github和googlecode上去了。
这段时间很忙,只能抽晚上时间修复了一些问题,有些时候到一两点,亚历山大啊。不过,很感谢各位朋友在email和osc中给我消息,指出afinal的一些错误和不足的地方,非常感谢,因为你们的存在,afinal才更加的完美。
目前,文档问题确实是一个问题,一直没有出文档的原因有以下几点:
1、afinal本身实在太简单了,看下demo就可以了,能调用的方法就这么几个。
2、我自己确实太忙,没有时间,所以如果那个朋友能帮忙写文档,对afinal,对使用afinal的朋友都将是一个非常大的帮助。
这次更新主要如下:
1、修改 FinalBitmap 添加 clearMemeoryCache方法
2、修改 DiskLruCache 清除磁盘缓存可能造成的的异常
3、修改 FinalBitmap 添加create(Context ctx) 修改为单例模式
1)、修改FinalBitmap ,create(Context ctx,String diskCachePath)
2)、修改FinalBitmap ,create(Context ctx,String diskCachePath,float memoryCacheSizePercent)
3)、修改FinalBitmap ,create(Context ctx,String diskCachePath,int memoryCacheSize)
4)、修改FinalBitmap ,create(Context ctx,String diskCachePath,float memoryCacheSizePercent,int threadSize)
5)、修改FinalBitmap .create(Context ctx,String diskCachePath,int memoryCacheSize,int threadSize)
6)、修改FinalBitmap .create(Context ctx,String diskCachePath,float memoryCacheSizePercent,int diskCacheSize,int threadSize)
7)、修改FinalBitmap .create(Context ctx,String diskCachePath,int memoryCacheSize,int diskCacheSize,int threadSize)
4、修改FinalBitmap ,添加清除缓存的时候回收bitmap
5、修改FinalBitmap ,create(Context ctx)
6、修改FinalDb,添加findDbModelListBySQL方法
7、修复FinalDb,修复属性为boolean的时候可能出错的情况
在属性为 boolean isAdmin的时候eclipse生成的get和set为 getAdmin和isAdmin,属性为 boolean admin的时候eclipse生成的get和set也是getAdmin和isAdmin。坑爹啊。
8、其他的的一些细节
最后,afinal正在oschina参加2012年度最受欢迎的开源软件评选活动(网址:),别忘记了afinal一票哦。
来自:开源中国社区
作者: &发布日期:
fb.display(holder.imgFileIcon, fileInfo.getFilePath()); 不能加载本地图片吗。uil写本地就报错
共有评论数 1/每页显示数 10
发表评论,与各位同人交流。回复请点击下方的我要评论按钮(游客可回复),要发表贴子请点击
Linux教程下载?“”(请点击),Linux教程免费下载。
求助Linux问题?论坛有39版块,覆盖所有Linux技术层面。前往“”
 |  |  |  |  |  |  |  |  |  |  |  | 
&2015 红联 Powered by SupSite

我要回帖

更多关于 cache可以删除吗 的文章

 

随机推荐