当前位置 : 主页 > 网络编程 > 其它编程 >

android图片缓存,记录一下

来源:互联网 收集:自由互联 发布时间:2023-07-02
文章来自http:keegan-lee.diandian.compost2012-12-0640047548955多写了点注释而已没有其他的变化http://img.558idc.com/uploadfile/allimg/0629/www.diandian.com, 100, outStream);outStream.flush();outStream.close();} catch (FileNot
文章来自http:keegan-lee.diandian.compost2012-12-0640047548955多写了点注释而已没有其他的变化http://img.558idc.com/uploadfile/allimg/0629/www.diandian.com, 100, outStream);outStream.flush();outStream.close();} catch (FileNotFoundException e) {Log.w("ImageFileCache", "FileNotFoundException");} catch (IOException e) {Log.w("ImageFileCache", "IOException");}}/*** 计算存储目录下的文件大小* 当文件总大小大于规定的CACHE_SIZE或者sdcard剩余空间小于FREE_SD_SPACE_NEEDED_TO_CACHE的规定* 那么删除40%最近没有被使用的文件*/private boolean removeCache(String dirPath) {// 以路径dirPath构造File实例File dir new File(dirPath);// 图片文件数组 dir不是路径时返回nullFile[] files dir.listFiles();// if (files null) {return true;}// sd卡的存储状态必须可读可写否则返回falseif (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {return false;}int dirSize 0;for (int i 0; i freeSpaceOnSd()) {// 要移除的文件个数int removeFactor (int) ((0.4 * files.length) 1);// 根据文件修改时间排序Arrays.sort(files, new FileLastModifSort());for (int i 0; i arg1.lastModified()) {return 1;} else if (arg0.lastModified() arg1.lastModified()) {return 0;} else {return -1;}}}}

 

public class ImageMemoryCache {/*** 从内存读取数据速度是最快的为了更大限度使用内存这里使用了两层缓存。* 硬引用缓存不会轻易被回收用来保存常用数据不常用的转入软引用缓存。*/private static final int SOFT_CACHE_SIZE 15; //软引用缓存容量private static LruCache mLruCache; //硬引用缓存private static LinkedHashMap mSoftCache; //软引用缓存public ImageMemoryCache(Context context) {// 通过ActivityManager获取应用的可用内存大小单位mbint memClass ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();// 硬引用缓存容量int cacheSize 1024 * 1024 * memClass / 4; //硬引用缓存容量为系统可用内存的1/4 mLruCache new LruCache(cacheSize) {Overrideprotected int sizeOf(String key, Bitmap value) {if (value ! null)return value.getRowBytes() * value.getHeight();elsereturn 0;}Overrideprotected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {if (oldValue ! null)// 硬引用缓存容量满的时候会根据LRU算法把最近没有被使用的图片转入此软引用缓存mSoftCache.put(key, new SoftReference(oldValue));}};mSoftCache new LinkedHashMap(SOFT_CACHE_SIZE, 0.75f, true) {private static final long serialVersionUID 6040103833179403725L;Overrideprotected boolean removeEldestEntry(Entry eldest) {if (size() > SOFT_CACHE_SIZE){ return true; } return false; }};}/*** 从缓存中获取图片*/public Bitmap getBitmapFromCache(String url) {Bitmap bitmap;//先从硬引用缓存中获取synchronized (mLruCache) {bitmap mLruCache.get(url);if (bitmap ! null) {//如果找到的话把元素移到LinkedHashMap的最前面从而保证在LRU算法中是最后被删除 mLruCache.remove(url);mLruCache.put(url, bitmap);return bitmap;}}//如果硬引用缓存中找不到到软引用缓存中找synchronized (mSoftCache) { SoftReference bitmapReference mSoftCache.get(url);if (bitmapReference ! null) {bitmap bitmapReference.get();if (bitmap ! null) {//将图片移回硬缓存 mLruCache.put(url, bitmap);mSoftCache.remove(url);return bitmap;} else {mSoftCache.remove(url);}}}return null;} /*** 添加图片到缓存*/public void addBitmapToCache(String url, Bitmap bitmap) {if (bitmap ! null) {synchronized (mLruCache) {mLruCache.put(url, bitmap);}}}public void clearCache() {mSoftCache.clear();}}

 

package bitmap.cache;import java.io.FilterInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.Log;public class ImageGetFromHttp {private static final String LOG_TAG "ImageGetFromHttp";public static Bitmap downloadBitmap(String url) {final HttpClient client new DefaultHttpClient();final HttpGet getRequest new HttpGet(url);try {HttpResponse response client.execute(getRequest);final int statusCode response.getStatusLine().getStatusCode();if (statusCode ! HttpStatus.SC_OK) {Log.w(LOG_TAG, "Error " statusCode " while retrieving bitmap from " url);return null;}final HttpEntity entity response.getEntity();if (entity ! null) {InputStream inputStream null;try {inputStream entity.getContent();FilterInputStream fit new FlushedInputStream(inputStream);return BitmapFactory.decodeStream(fit);} finally {if (inputStream ! null) {inputStream.close();inputStream null;}entity.consumeContent();}}} catch (IOException e) {getRequest.abort();Log.w(LOG_TAG, "I/O error while retrieving bitmap from " url, e);} catch (IllegalStateException e) {getRequest.abort();Log.w(LOG_TAG, "Incorrect URL: " url);} catch (Exception e) {getRequest.abort();Log.w(LOG_TAG, "Error while retrieving bitmap from " url, e);} finally {client.getConnectionManager().shutdown();}return null;}/** An InputStream that skips the exact number of bytes provided, unless it reaches EOF.*/static class FlushedInputStream extends FilterInputStream {public FlushedInputStream(InputStream inputStream) {super(inputStream);}Overridepublic long skip(long n) throws IOException {long totalBytesSkipped 0L;while (totalBytesSkipped < n) {long bytesSkipped in.skip(n - totalBytesSkipped);if (bytesSkipped 0L) {int b read();if (b <0) {break; // we reached EOF} else {bytesSkipped 1; // we read one byte }}totalBytesSkipped bytesSkipped;}return totalBytesSkipped;}}}

 

public class GetBitmap {/*** 获得一张图片,从三个地方获取,首先是内存缓存,然后是文件缓存,最后从网络获取 ***/public static Bitmap getBitmap(String url) {// 从内存缓存中获取图片Bitmap result TestApp.memoryCache.getBitmapFromCache(url);if (result null) {// 文件缓存中获取result TestApp.fileCache.getImage(url);if (result null) {// 从网络获取result ImageGetFromHttp.downloadBitmap(url);if (result ! null) {TestApp.fileCache.saveBitmap(result, url);TestApp.memoryCache.addBitmapToCache(url, result);}} else {// 添加到内存缓存 TestApp.memoryCache.addBitmapToCache(url, result);}}return result;}}

 

就这样了啊要记得用线程加载啊否则就。。。。。。。。。。。你懂的

 

 

 

转:https://www.cnblogs.com/jinglingJuly/archive/2013/05/21/3089951.html

【文章原创作者大丰网页制作公司 http://www.1234xp.com/dafeng.html 欢迎留下您的宝贵建议】
网友评论