1. 程式人生 > >android app 快取 ---- android 檔案快取使用流程解析

android app 快取 ---- android 檔案快取使用流程解析

在度娘那裡搜尋了一下,關於android 快取的資源介紹,發現都是泛泛而談,沒有給出詳細的使用方法。看各路大神的介紹,快取一般分為兩種形式(1.資料庫快取,2.檔案快取)。

資料庫快取,看到這個名字,想必都知道怎麼回事了,將網路請求的資料,一一對應存入本地資料庫中,來達到快取的效果。

檔案快取,這裡主要是txt檔案快取,將網路請求的資料快取到本地檔案中,來達到快取效果。

為什麼要用快取,這裡就不說了,百度講的最清楚的就屬這個了。總而言之為了更好的使用者體驗(沒網路的時候也有快取資料,不用不停的去請求資料減輕伺服器壓力,減少請求資料的耗時卡頓,等等等等)

檔案快取的原理:

從最外層的有無網路開始說起,當無網路的時候,進入快取的判斷,判斷快取檔案是否存在,存在直接載入快取,不存在,給個無網路操作。

在有網路的時候,先進行快取判斷,看檔案快取最後編輯時間到現在的時間段,是否超過了自己在程式中設定的快取時間,如果超出了快取時間,請求網路資料,更新覆蓋原快取,如果沒有超出快取時間,直接載入快取資料,不做網路請求。

原理就是這樣。下面上程式碼,走一遍快取流程。

/**
 * Created by GT on 2015/10/21.
 * 檔案快取工具類
 */
public class FileUtil {
    public static int CACHE_TIME = 10000 * 6;//1分鐘
public static int CACHE_TIME1 = 10000 * 6 * 60 * 2;//2個小時
public static int 
CACHE_TIME2 = 10000 * 6 * 60 * 3;//3個小時 public static int CACHE_TIME3 = 10000 * 6 * 60 * 5;//5個小時 public static int CACHE_TIME4 = 10000 * 6 * 60 * 7;//7個小時 public static int CACHE_TIME5 = 10000 * 6 * 60 * 12;//12個小時 public static int CACHE_TIME6 = 10000 * 6 * 60 * 24;//24個小時 public static String CACHEFILEPATH = Tools.getSDPath() + "/pdsrd"
; public static String SHANGCHENGHUANDENG = "shangchenghuandeng.txt";//商城幻燈片 /** * 將資料寫入檔案快取 * * @param ser * @param file * @return */ public static boolean saveObject(Serializable ser, File file) { File newFile = new File(CACHEFILEPATH); if (!newFile.exists()) { newFile.mkdirs(); } FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream(file, false); oos = new ObjectOutputStream(fos); oos.writeObject(ser);// 寫入 return true; } catch (Exception e) { e.printStackTrace(); return false; } finally { try { fos.close(); oos.close(); } catch (Exception e) { } } } /** * 讀取物件 * * @param file * @return */ public static Serializable readObject(File file) { FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream(file); //獲得輸入流 ois = new ObjectInputStream(fis); return (Serializable) ois.readObject(); } catch (StreamCorruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); return null; } finally { try { ois.close(); } catch (Exception e) { } try { fis.close(); } catch (Exception e) { } } return null; } /** * 判斷檔案快取是否過期 * * @param data * @param time * @return */ public static boolean isCacheDataFailure(File data, int time) { boolean failure = false; if ((System.currentTimeMillis() - data.lastModified()) > time) failure = true; else if (!data.exists()) failure = true; return failure; } public static String getCacheDecodeString(String url) { //1. 處理特殊字元 //2. 去除字尾名帶來的檔案瀏覽器的檢視凌亂(特別是圖片更需要如此類似處理,否則有的手機開啟相簿,全是我們的快取圖片) if (url != null) { return url.replaceAll("[.:/,%?&=]", "+").replaceAll("[+]+", "+"); } return null; } }

這個是快取工具類,重要的兩個,資料的寫入和讀取。  上面的快取時間,由自己決定,如果介面資料更新比較快,則設定短時間更新,如該資料變動不頻繁,可適量的加長快取時間,減少網路請求。

if (Tools.getMobilNetStatus(this) == 0) {//判斷是否有網路,這裡是沒有網路
if (!new File(topPicFilePath).exists()) {//判斷快取檔案是否存在,如果不存在給個提示
            Toast.makeText(ShangchengActivity.this, "當前網路不可用", Toast.LENGTH_SHORT).show();
} else {
            //這裡是快取檔案存在的情況,存在快取檔案,因為無網,不判斷快取是否過期,直接拿出快取.拿出快取,直接繫結控制元件即可
File slideFile = new File(FileUtil.CACHEFILEPATH, FileUtil.SHANGCHENGHUANDENG);
slideBeans = (ArrayList<ShouYeAdBean>) FileUtil.readObject(slideFile);
setSlideImg(slideBeans);
}

else {//如果有網路
    /**
     * 檢查快取是否過期     */
String topPicFilePath = FileUtil.CACHEFILEPATH + "/" + FileUtil.SHANGCHENGHUANDENG;//快取地址
    if (new File(topPicFilePath).exists()) {//先檢查快取檔案是否存在
        if (FileUtil.isCacheDataFailure(new File(topPicFilePath), FileUtil.CACHE_TIME1)) {                     //判斷檔案快取是否過期,第一個引數為檔案,第二個引數為快取時間。判斷為過期,則執行下一步
            requestSlide();//重新請求資料
} else {//判斷快取沒有過期,讀取快取,載入快取到控制元件,避免網路請求資料
            File file = new File(FileUtil.CACHEFILEPATH, FileUtil.SHANGCHENGHUANDENG);
slideBeans = (ArrayList<ShouYeAdBean>) FileUtil.readObject(file);
setSlideImg(slideBeans);
}
    } else {//這裡判斷快取檔案不存在的情況下,重新請求一下
        requestSlide();//載入幻燈片
}

以上就是進入當前介面的判斷和讀取快取的思路和程式實現。

上面只提到了讀快取,存快取放在什麼地方呢,當然是放在每次的網路請求中,請求成功了,就增加或者更新快取。

File file = new File(FileUtil.CACHEFILEPATH, FileUtil.SHANGCHENGHUANDENG);
FileUtil.saveObject(slideBeans, file);

備註:快取的使用,要主要考慮全面,有網無網,有快取無快取,快取是否過期,一點考慮不到就可能出現指向空路徑,指向空檔案,等等異常。

結束。 如有不明確的地方,可以回覆,榮幸與各位開發者公共探討。
原創文章,轉載請註明出處: http://blog.csdn.net/qq_33078541?viewmode=contents