天天看點

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 = **;//緩存檔案最大限制大小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(, TimeUnit.SECONDS);  //設定連接配接逾時時間  
        builder.writeTimeout(, TimeUnit.SECONDS);//設定寫入逾時時間  
        builder.readTimeout(, 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(, 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) {  



        }  
    }