1. 程式人生 > >Android OKhttp3快取處理

Android OKhttp3快取處理

使用方法很簡單:

1.首先進行先進行設定:


public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/json; charset=utf-8");//設定MediaType  
    private static final OkHttpClient client;  
    private static final long cacheSize = 1024*1024*20;//快取檔案最大限制大小20M  
    private static String cachedirectory = FilePathroot + "/caches"
; //設定快取檔案路徑 private static Cache cache = new Cache(new File(cachedirectory), cacheSize); // static { OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(8, TimeUnit.SECONDS); //設定連線超時時間 builder.writeTimeout(8, TimeUnit.SECONDS);//設定寫入超時時間
builder.readTimeout(8, TimeUnit.SECONDS);//設定讀取資料超時時間 builder.retryOnConnectionFailure(false);//設定不進行連線失敗重試 builder.cache(cache);//這種快取 client = builder.build(); }

注意的是:okhttp只會對get請求進行快取,post請求是不會進行快取,這也是有道理的,因為get請求的資料一般是比較持久的,而post一般是互動操作,沒太大意義進行快取。

2.進行get請求:
一般來說的是,我們get請求有時有不一樣的需求,有時需要進行快取,有時需要直接從網路獲取,有時只獲取快取資料,這些處理,okhttp都有幫我們做了,我們做的只需要設定就是了。下面是整理的各種需求的設定與使用方法。

1.進行get請求,並將資料快取。


/** 
     *@param url 
     *@param cache_maxAge_inseconds 快取最大生存時間,單位為秒 
     *@return 當前call 
     *-------------------- 
     *TODO get請求,並快取請求資料,返回的是快取資料,注意,如果超出了maxAge,快取會被清除,回撥onfail 
     */  
    public static Call DoGetAndCache(String url,int cache_maxAge_inseconds) {  

        Request request = new Request.Builder()  
                .cacheControl(new CacheControl.Builder().maxAge(cache_maxAge_inseconds, TimeUnit.SECONDS).build())  
                .url(url).build();  

        Call call = client.newCall(request);  
        startrequest(call);  
        return call;  
    }  

2.get請求,但只獲取返回網路資料。


/** 
     * get請求 ,只獲取返回網路請求資料,不進行快取 
     *  
     * @param url 
     * @param responseListener 
     */  
    public static Call DoGetOnlyNet(String url) {  
        Request request = new Request.Builder()  
                .cacheControl(new CacheControl.Builder().maxAge(0, TimeUnit.SECONDS).build())  
                .url(url).build();  

        Call call = client.newCall(request);  
        startrequest(call);  
        return call;  
    }  

3.進行get請求,並限制過時時間


/** 
     * get請求, 沒有超過過時時間StaleTime的話,返回快取資料,否則重新去獲取網路資料,StaleTime限制了預設資料fresh時間 
     * @param url 
     *  @param staletime 過時時間,秒為單位 
     */  
    public static Call DoGetInStaleTime(String url, int staletime) {  
        Request request = new Request.Builder()  
                .cacheControl(new CacheControl.Builder().maxStale(staletime, TimeUnit.SECONDS).build()).url(url).build();  

        Call call = client.newCall(request);  
        startrequest( call);  
        return call;  
    }  

這裡說明下StaleTime與maxAge的區別。

StaleTime:指的是過時時間,設定它後,會將資料快取,如果沒有超過過時時間,說明資料還是新的,或直接拿快取資料返回,如果超過是過時時間,那麼我們認為資料過時了,它會去或者網路資料進行更新並返回,注意,它是不會刪除快取的。

maxAge:限制了快取的生存時間,超過了就會刪除該請求的快取。

4.只獲取返回快取資料


/** 
     * get請求, 只使用快取,注意,如果是超出了staletime或者超出了maxAge的話會返回504,否則就返回快取資料 
     * @param url 
     */  
    public static Call DoGetOnlyCache(String url) {  
        Request request = new Request.Builder()  
                .cacheControl(new CacheControl.Builder().onlyIfCached().build()).url(url).build();  

        Call call = client.newCall(request);  
        startrequest(call);  
        return call;  

startrequest(Call call0):


private static void startrequest(final Call call0) {  

        try {  

            call0.enqueue(new Callback() {  

                @Override  
                public void onFailure(Call arg0, IOException arg1) {  
                    //請求失敗  

                }  

                @Override  
                public void onResponse(Call arg0, Response response) throws IOException {  

                    //請求返回資料  
                }  

            });  

        } catch (Exception e) {  



        }  
    }