編輯:關於Android編程
public class ImageFileCache
{
private static final String TAG = "ImageFileCache";
//圖片緩存目錄
private static final String IMGCACHDIR = "/sdcard/ImgCach";
//保存的cache文件寬展名
private static final String CACHETAIL = ".cach";
private static final int MB = 1024*1024;
private static final int CACHE_SIZE = 1;
//當SD卡剩余空間小於10M的時候會清理緩存
private static final int FREE_SD_SPACE_NEEDED_TO_CACHE = 10;
public ImageFileCache()
{
//清理部分文件緩存
removeCache(IMGCACHDIR);
}
/**
* 從緩存中獲取圖片
*/
public Bitmap getImageFromFile(final String url)
{
final String path = IMGCACHDIR + "/" + convertUrlToFileName(url);
File file = new File(path);
if (file != null && file.exists())
{
Bitmap bmp = BitmapFactory.decodeFile(path);
if (bmp == null)
{
file.delete();
}
else
{
updateFileTime(path);
Logger.d(TAG, "get bmp from FileCache,url=" + url);
return bmp;
}
}
return null;
}
/**
* 將圖片存入文件緩存
*/
public void saveBitmapToFile(Bitmap bm, String url)
{
if (bm == null) {
return;
}
//判斷sdcard上的空間
if (FREE_SD_SPACE_NEEDED_TO_CACHE > SdCardFreeSpace())
{
//SD空間不足
return;
}
String filename = convertUrlToFileName(url);
File dirFile = new File(IMGCACHDIR);
if (!dirFile.exists())
dirFile.mkdirs();
File file = new File(IMGCACHDIR +"/" + filename);
try
{
file.createNewFile();
OutputStream outStream = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
}
catch (FileNotFoundException e)
{
Logger.d(TAG, "FileNotFoundException");
}
catch (IOException e)
{
Logger.d(TAG, "IOException");
}
}
/**
* 計算存儲目錄下的文件大小,
* 當文件總大小大於規定的CACHE_SIZE或者sdcard剩余空間小於FREE_SD_SPACE_NEEDED_TO_CACHE的規定
* 那麼刪除40%最近沒有被使用的文件
*/
private boolean removeCache(String dirPath)
{
File dir = new File(dirPath);
File[] files = dir.listFiles();
if (files == null)
{
return true;
}
if (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
{
return false;
}
int dirSize = 0;
for (int i = 0; i < files.length; i++)
{
if (files[i].getName().contains(CACHETAIL))
{
dirSize += files[i].length();
}
}
if (dirSize > CACHE_SIZE * MB || FREE_SD_SPACE_NEEDED_TO_CACHE > SdCardFreeSpace())
{
int removeFactor = (int) (0.4 * files.length);
Arrays.sort(files, new FileLastModifSort());
for (int i = 0; i < removeFactor; i++)
{
if (files[i].getName().contains(CACHETAIL))
{
files[i].delete();
}
}
}
if (SdCardFreeSpace() <= CACHE_SIZE)
{
return false;
}
return true;
}
/**
* 修改文件的最後修改時間
*/
public void updateFileTime(String path)
{
File file = new File(path);
long newModifiedTime = System.currentTimeMillis();
file.setLastModified(newModifiedTime);
}
/**
* 計算SD卡上的剩余空間
*/
private int SdCardFreeSpace()
{
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
double sdFreeMB = ((double)stat.getAvailableBlocks() * (double) stat.getBlockSize()) / MB;
return (int) sdFreeMB;
}
/**
* 將url轉成文件名
*/
private String convertUrlToFileName(String url)
{
return url.hashCode() + CACHETAIL;
}
/**
* 根據文件的最後修改時間進行排序
*/
private class FileLastModifSort implements Comparator
{
public int compare(File file0, File file1)
{
if (file0.lastModified() > file1.lastModified())
{
return 1;
}
else if (file0.lastModified() == file1.lastModified())
{
return 0;
}
else
{
return -1;
}
}
}
}
說明:上述代碼很好理解而且都有注釋,不用多說了。
到這裡,整個banner體系的代碼都被介紹了,希望代碼中的思想能夠對大家有所啟發,謝謝大家的捧場!
自定義View實現Android圓形進度條,支持自定義顯示的樣式
我是完全根據這裡仿制了一個作為備忘,可以點擊這裡查看原始版本代碼如下:1、res/values/attrs.xml 2、具體實現 publ
Android之——代碼混淆
Android自身可以實現代碼的混淆功能,Android集成了代碼混淆的功能,這些功能在Android SDK的tools有個proguard目錄,這個目錄下就是提供了A
移動大王卡怎麼購買?移動大王卡怎麼激活?移動大王卡購買鏈接
移動大王卡怎麼購買、移動大王卡怎麼激活呢?下面小編分享一下移動大王卡購買鏈接,一起來看看吧。 移動大王卡怎麼購買? 通過山東移動掌廳申請,點擊&
【首發】AndroidStudio配置JavaCV環境
由於最近參加一個比賽需要用到人臉識別,但賽方限制使用第三方服務商提供的API雲服務調用,因此想到了使用javacv來實現,但通過百度、google搜索發現所有的教程都是在