缓存工具类ACache使用方法详解
本文实例为大家分享了缓存工具类ACache的使用,供大家参考,具体内容如下
(1).ACachemCache=ACache.get(this);
(2).StringcacheData=mCache.getAsString("cache_data");
(3).if(!TextUtils.isEmpty(cacheData)){
解析、setAdapter、
}
(4).然后仍然请求网络,因为缓存的意义是为了在没网的情况下有数据显示。
(5).网络请求后获得的数据再
mCache.remove("cache_data");
mCache.put("cache_data",data);
Acache.java:
/** *Copyright(c)2012-2013,MichaelYang杨福海(www.yangfuhai.com). * *LicensedundertheApacheLicense,Version2.0(the"License"); *youmaynotusethisfileexceptincompliancewiththeLicense. *YoumayobtainacopyoftheLicenseat * *http://www.apache.org/licenses/LICENSE-2.0 * *Unlessrequiredbyapplicablelaworagreedtoinwriting,software *distributedundertheLicenseisdistributedonan"ASIS"BASIS, *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied. *SeetheLicenseforthespecificlanguagegoverningpermissionsand *limitationsundertheLicense. */ packagecom.monkey.monkeymushroom.utils; importjava.io.BufferedReader; importjava.io.BufferedWriter; importjava.io.ByteArrayInputStream; importjava.io.ByteArrayOutputStream; importjava.io.File; importjava.io.FileOutputStream; importjava.io.FileReader; importjava.io.FileWriter; importjava.io.IOException; importjava.io.ObjectInputStream; importjava.io.ObjectOutputStream; importjava.io.RandomAccessFile; importjava.io.Serializable; importjava.util.Collections; importjava.util.HashMap; importjava.util.Map; importjava.util.Map.Entry; importjava.util.Set; importjava.util.concurrent.atomic.AtomicInteger; importjava.util.concurrent.atomic.AtomicLong; importorg.json.JSONArray; importorg.json.JSONObject; importandroid.content.Context; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.graphics.Canvas; importandroid.graphics.PixelFormat; importandroid.graphics.drawable.BitmapDrawable; importandroid.graphics.drawable.Drawable; /** *@authorMichaelYang(www.yangfuhai.com)updateat2013.08.07 */ publicclassACache{ publicstaticfinalintTIME_HOUR=60*60; publicstaticfinalintTIME_DAY=TIME_HOUR*24; privatestaticfinalintMAX_SIZE=1000*1000*100;//100mb-->原来50M privatestaticfinalintMAX_COUNT=Integer.MAX_VALUE;//不限制存放数据的数量 privatestaticMapmInstanceMap=newHashMap (); privateACacheManagermCache; publicstaticACacheget(Contextctx){ returnget(ctx,"ACache"); } publicstaticACacheget(Contextctx,StringcacheName){ Filef=newFile(ctx.getCacheDir(),cacheName); returnget(f,MAX_SIZE,MAX_COUNT); } publicstaticACachegetKx(Contextctx,StringcacheName){ StringkxDir=ctx.getFilesDir().getAbsolutePath()+"/KxDir"; Filef=newFile(kxDir,cacheName); returnget(f,MAX_SIZE,MAX_COUNT); } publicstaticACacheget(FilecacheDir){ returnget(cacheDir,MAX_SIZE,MAX_COUNT); } publicstaticACacheget(Contextctx,longmax_zise,intmax_count){ Filef=newFile(ctx.getCacheDir(),"ACache"); returnget(f,max_zise,max_count); } publicstaticACacheget(FilecacheDir,longmax_zise,intmax_count){ ACachemanager=mInstanceMap.get(cacheDir.getAbsoluteFile()+myPid()); if(manager==null){ manager=newACache(cacheDir,max_zise,max_count); mInstanceMap.put(cacheDir.getAbsolutePath()+myPid(),manager); } returnmanager; } privatestaticStringmyPid(){ return"_"+android.os.Process.myPid(); } privateACache(FilecacheDir,longmax_size,intmax_count){ if(!cacheDir.exists()&&!cacheDir.mkdirs()){ thrownewRuntimeException("can'tmakedirsin"+cacheDir.getAbsolutePath()); } mCache=newACacheManager(cacheDir,max_size,max_count); } //======================================= //============String数据读写============== //======================================= /** *保存String数据到缓存中 * *@paramkey保存的key *@paramvalue保存的String数据 */ publicvoidput(Stringkey,Stringvalue){ Filefile=mCache.newFile(key); BufferedWriterout=null; try{ out=newBufferedWriter(newFileWriter(file),1024); out.write(value); }catch(IOExceptione){ e.printStackTrace(); }finally{ if(out!=null){ try{ out.flush(); out.close(); }catch(IOExceptione){ e.printStackTrace(); } } mCache.put(file); } } /** *保存String数据到缓存中 * *@paramkey保存的key *@paramvalue保存的String数据 *@paramsaveTime保存的时间,单位:秒 */ publicvoidput(Stringkey,Stringvalue,intsaveTime){ put(key,Utils.newStringWithDateInfo(saveTime,value)); } /** *读取String数据 * *@paramkey *@returnString数据 */ publicStringgetAsString(Stringkey){ Filefile=mCache.get(key); if(!file.exists()) returnnull; booleanremoveFile=false; BufferedReaderin=null; try{ in=newBufferedReader(newFileReader(file)); StringreadString=""; StringcurrentLine; while((currentLine=in.readLine())!=null){ readString+=currentLine; } if(!Utils.isDue(readString)){ returnUtils.clearDateInfo(readString); }else{ removeFile=true; returnnull; } }catch(IOExceptione){ e.printStackTrace(); returnnull; }finally{ if(in!=null){ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } if(removeFile) remove(key); } } //======================================= //=============JSONObject数据读写============== //======================================= /** *保存JSONObject数据到缓存中 * *@paramkey保存的key *@paramvalue保存的JSON数据 */ publicvoidput(Stringkey,JSONObjectvalue){ put(key,value.toString()); } /** *保存JSONObject数据到缓存中 * *@paramkey保存的key *@paramvalue保存的JSONObject数据 *@paramsaveTime保存的时间,单位:秒 */ publicvoidput(Stringkey,JSONObjectvalue,intsaveTime){ put(key,value.toString(),saveTime); } /** *读取JSONObject数据 * *@paramkey *@returnJSONObject数据 */ publicJSONObjectgetAsJSONObject(Stringkey){ StringJSONString=getAsString(key); try{ JSONObjectobj=newJSONObject(JSONString); returnobj; }catch(Exceptione){ e.printStackTrace(); returnnull; } } //======================================= //============JSONArray数据读写============= //======================================= /** *保存JSONArray数据到缓存中 * *@paramkey保存的key *@paramvalue保存的JSONArray数据 */ publicvoidput(Stringkey,JSONArrayvalue){ put(key,value.toString()); } /** *保存JSONArray数据到缓存中 * *@paramkey保存的key *@paramvalue保存的JSONArray数据 *@paramsaveTime保存的时间,单位:秒 */ publicvoidput(Stringkey,JSONArrayvalue,intsaveTime){ put(key,value.toString(),saveTime); } /** *读取JSONArray数据 * *@paramkey *@returnJSONArray数据 */ publicJSONArraygetAsJSONArray(Stringkey){ StringJSONString=getAsString(key); try{ JSONArrayobj=newJSONArray(JSONString); returnobj; }catch(Exceptione){ e.printStackTrace(); returnnull; } } //======================================= //==============byte数据读写============= //======================================= /** *保存byte数据到缓存中 * *@paramkey保存的key *@paramvalue保存的数据 */ publicvoidput(Stringkey,byte[]value){ Filefile=mCache.newFile(key); FileOutputStreamout=null; try{ out=newFileOutputStream(file); out.write(value); }catch(Exceptione){ e.printStackTrace(); }finally{ if(out!=null){ try{ out.flush(); out.close(); }catch(IOExceptione){ e.printStackTrace(); } } mCache.put(file); } } /** *保存byte数据到缓存中 * *@paramkey保存的key *@paramvalue保存的数据 *@paramsaveTime保存的时间,单位:秒 */ publicvoidput(Stringkey,byte[]value,intsaveTime){ put(key,Utils.newByteArrayWithDateInfo(saveTime,value)); } /** *获取byte数据 * *@paramkey *@returnbyte数据 */ publicbyte[]getAsBinary(Stringkey){ RandomAccessFileRAFile=null; booleanremoveFile=false; try{ Filefile=mCache.get(key); if(!file.exists()) returnnull; RAFile=newRandomAccessFile(file,"r"); byte[]byteArray=newbyte[(int)RAFile.length()]; RAFile.read(byteArray); if(!Utils.isDue(byteArray)){ returnUtils.clearDateInfo(byteArray); }else{ removeFile=true; returnnull; } }catch(Exceptione){ e.printStackTrace(); returnnull; }finally{ if(RAFile!=null){ try{ RAFile.close(); }catch(IOExceptione){ e.printStackTrace(); } } if(removeFile) remove(key); } } //======================================= //=============序列化数据读写=============== //======================================= /** *保存Serializable数据到缓存中 * *@paramkey保存的key *@paramvalue保存的value */ publicvoidput(Stringkey,Serializablevalue){ put(key,value,-1); } /** *保存Serializable数据到缓存中 * *@paramkey保存的key *@paramvalue保存的value *@paramsaveTime保存的时间,单位:秒 */ publicvoidput(Stringkey,Serializablevalue,intsaveTime){ ByteArrayOutputStreambaos=null; ObjectOutputStreamoos=null; try{ baos=newByteArrayOutputStream(); oos=newObjectOutputStream(baos); oos.writeObject(value); byte[]data=baos.toByteArray(); if(saveTime!=-1){ put(key,data,saveTime); }else{ put(key,data); } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ oos.close(); }catch(IOExceptione){ } } } /** *读取Serializable数据 * *@paramkey *@returnSerializable数据 */ publicObjectgetAsObject(Stringkey){ byte[]data=getAsBinary(key); if(data!=null){ ByteArrayInputStreambais=null; ObjectInputStreamois=null; try{ bais=newByteArrayInputStream(data); ois=newObjectInputStream(bais); ObjectreObject=ois.readObject(); returnreObject; }catch(Exceptione){ e.printStackTrace(); returnnull; }finally{ try{ if(bais!=null) bais.close(); }catch(IOExceptione){ e.printStackTrace(); } try{ if(ois!=null) ois.close(); }catch(IOExceptione){ e.printStackTrace(); } } } returnnull; } //======================================= //==============bitmap数据读写============= //======================================= /** *保存bitmap到缓存中 * *@paramkey保存的key *@paramvalue保存的bitmap数据 */ publicvoidput(Stringkey,Bitmapvalue){ put(key,Utils.Bitmap2Bytes(value)); } /** *保存bitmap到缓存中 * *@paramkey保存的key *@paramvalue保存的bitmap数据 *@paramsaveTime保存的时间,单位:秒 */ publicvoidput(Stringkey,Bitmapvalue,intsaveTime){ put(key,Utils.Bitmap2Bytes(value),saveTime); } /** *读取bitmap数据 * *@paramkey *@returnbitmap数据 */ publicBitmapgetAsBitmap(Stringkey){ if(getAsBinary(key)==null){ returnnull; } returnUtils.Bytes2Bimap(getAsBinary(key)); } //======================================= //=============drawable数据读写============= //======================================= /** *保存drawable到缓存中 * *@paramkey保存的key *@paramvalue保存的drawable数据 */ publicvoidput(Stringkey,Drawablevalue){ put(key,Utils.drawable2Bitmap(value)); } /** *保存drawable到缓存中 * *@paramkey保存的key *@paramvalue保存的drawable数据 *@paramsaveTime保存的时间,单位:秒 */ publicvoidput(Stringkey,Drawablevalue,intsaveTime){ put(key,Utils.drawable2Bitmap(value),saveTime); } /** *读取Drawable数据 * *@paramkey *@returnDrawable数据 */ publicDrawablegetAsDrawable(Stringkey){ if(getAsBinary(key)==null){ returnnull; } returnUtils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key))); } /** *获取缓存文件 * *@paramkey *@returnvalue缓存的文件 */ publicFilefile(Stringkey){ Filef=mCache.newFile(key); if(f.exists()) returnf; returnnull; } /** *移除某个key * *@paramkey *@return是否移除成功 */ publicbooleanremove(Stringkey){ returnmCache.remove(key); } /** *清除所有数据 */ publicvoidclear(){ mCache.clear(); } /** *@author杨福海(michael)www.yangfuhai.com *@version1.0 *@title缓存管理器 */ publicclassACacheManager{ privatefinalAtomicLongcacheSize; privatefinalAtomicIntegercacheCount; privatefinallongsizeLimit; privatefinalintcountLimit; privatefinalMap lastUsageDates=Collections.synchronizedMap(newHashMap ()); protectedFilecacheDir; privateACacheManager(FilecacheDir,longsizeLimit,intcountLimit){ this.cacheDir=cacheDir; this.sizeLimit=sizeLimit; this.countLimit=countLimit; cacheSize=newAtomicLong(); cacheCount=newAtomicInteger(); calculateCacheSizeAndCacheCount(); } /** *计算cacheSize和cacheCount */ privatevoidcalculateCacheSizeAndCacheCount(){ newThread(newRunnable(){ @Override publicvoidrun(){ intsize=0; intcount=0; File[]cachedFiles=cacheDir.listFiles(); if(cachedFiles!=null){ for(FilecachedFile:cachedFiles){ size+=calculateSize(cachedFile); count+=1; lastUsageDates.put(cachedFile,cachedFile.lastModified()); } cacheSize.set(size); cacheCount.set(count); } } }).start(); } privatevoidput(Filefile){ intcurCacheCount=cacheCount.get(); while(curCacheCount+1>countLimit){ longfreedSize=removeNext(); cacheSize.addAndGet(-freedSize); curCacheCount=cacheCount.addAndGet(-1); } cacheCount.addAndGet(1); longvalueSize=calculateSize(file); longcurCacheSize=cacheSize.get(); while(curCacheSize+valueSize>sizeLimit){ longfreedSize=removeNext(); curCacheSize=cacheSize.addAndGet(-freedSize); } cacheSize.addAndGet(valueSize); LongcurrentTime=System.currentTimeMillis(); file.setLastModified(currentTime); lastUsageDates.put(file,currentTime); } privateFileget(Stringkey){ Filefile=newFile(key); LongcurrentTime=System.currentTimeMillis(); file.setLastModified(currentTime); lastUsageDates.put(file,currentTime); returnfile; } privateFilenewFile(Stringkey){ returnnewFile(cacheDir,key.hashCode()+""); } privatebooleanremove(Stringkey){ Fileimage=get(key); returnimage.delete(); } privatevoidclear(){ lastUsageDates.clear(); cacheSize.set(0); File[]files=cacheDir.listFiles(); if(files!=null){ for(Filef:files){ f.delete(); } } } /** *移除旧的文件 * *@return */ privatelongremoveNext(){ if(lastUsageDates.isEmpty()){ return0; } LongoldestUsage=null; FilemostLongUsedFile=null; Set >entries=lastUsageDates.entrySet(); synchronized(lastUsageDates){ for(Entry entry:entries){ if(mostLongUsedFile==null){ mostLongUsedFile=entry.getKey(); oldestUsage=entry.getValue(); }else{ LonglastValueUsage=entry.getValue(); if(lastValueUsage saveTime+deleteAfter*1000){ returntrue; } } returnfalse; } privatestaticStringnewStringWithDateInfo(intsecond,StringstrInfo){ returncreateDateInfo(second)+strInfo; } privatestaticbyte[]newByteArrayWithDateInfo(intsecond,byte[]data2){ byte[]data1=createDateInfo(second).getBytes(); byte[]retdata=newbyte[data1.length+data2.length]; System.arraycopy(data1,0,retdata,0,data1.length); System.arraycopy(data2,0,retdata,data1.length,data2.length); returnretdata; } privatestaticStringclearDateInfo(StringstrInfo){ if(strInfo!=null&&hasDateInfo(strInfo.getBytes())){ strInfo=strInfo.substring(strInfo.indexOf(mSeparator)+1,strInfo.length()); } returnstrInfo; } privatestaticbyte[]clearDateInfo(byte[]data){ if(hasDateInfo(data)){ returncopyOfRange(data,indexOf(data,mSeparator)+1,data.length); } returndata; } privatestaticbooleanhasDateInfo(byte[]data){ returndata!=null&&data.length>15&&data[13]=='-'&&indexOf(data,mSeparator)>14; } privatestaticString[]getDateInfoFromDate(byte[]data){ if(hasDateInfo(data)){ StringsaveDate=newString(copyOfRange(data,0,13)); StringdeleteAfter=newString(copyOfRange(data,14,indexOf(data,mSeparator))); returnnewString[]{saveDate,deleteAfter}; } returnnull; } privatestaticintindexOf(byte[]data,charc){ for(inti=0;i "+to); byte[]copy=newbyte[newLength]; System.arraycopy(original,from,copy,0,Math.min(original.length-from,newLength)); returncopy; } privatestaticfinalcharmSeparator=''; privatestaticStringcreateDateInfo(intsecond){ StringcurrentTime=System.currentTimeMillis()+""; while(currentTime.length()<13){ currentTime="0"+currentTime; } returncurrentTime+"-"+second+mSeparator; } /* *Bitmap→byte[] */ privatestaticbyte[]Bitmap2Bytes(Bitmapbm){ if(bm==null){ returnnull; } ByteArrayOutputStreambaos=newByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG,100,baos); returnbaos.toByteArray(); } /* *byte[]→Bitmap */ privatestaticBitmapBytes2Bimap(byte[]b){ if(b.length==0){ returnnull; } returnBitmapFactory.decodeByteArray(b,0,b.length); } /* *Drawable→Bitmap */ privatestaticBitmapdrawable2Bitmap(Drawabledrawable){ if(drawable==null){ returnnull; } //取drawable的长宽 intw=drawable.getIntrinsicWidth(); inth=drawable.getIntrinsicHeight(); //取drawable的颜色格式 Bitmap.Configconfig=drawable.getOpacity()!=PixelFormat.OPAQUE?Bitmap.Config.ARGB_8888 :Bitmap.Config.RGB_565; //建立对应bitmap Bitmapbitmap=Bitmap.createBitmap(w,h,config); //建立对应bitmap的画布 Canvascanvas=newCanvas(bitmap); drawable.setBounds(0,0,w,h); //把drawable内容画到画布中 drawable.draw(canvas); returnbitmap; } /* *Bitmap→Drawable */ @SuppressWarnings("deprecation") privatestaticDrawablebitmap2Drawable(Bitmapbm){ if(bm==null){ returnnull; } returnnewBitmapDrawable(bm); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。