Retrofit2.0+okhttp3實現(xiàn)緩存

參考文章:Retrofit2.0+okhttp3緩存機制以及遇到的問題

參考文章 : 使用Retrofit和Okhttp實現(xiàn)網(wǎng)絡緩存。無網(wǎng)讀緩存咳焚,有網(wǎng)根據(jù)過期時間重新請求

參考文章 : okhttp3 retrofit2 緩存問題

我是按照上面文章的思路,把緩存加入到自己的項目

  • 首先就是思路和基本基本一樣的

然后就是我自己在弄的時候發(fā)現(xiàn)一些問題

Fatal Exception thrown on Scheduler.Worker thread

出現(xiàn)這個問題的主要原因就是Retrofit 和OKHttp 的版本問題
我自己用到的 Retrofit2的版本是2.1.0版本,也就是最新的, OKHttp 3的版本是3.4.0 但是這樣的組合就是出現(xiàn)了問題,

java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
       at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:54)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:145)
       at android.app.ActivityThread.main(ActivityThread.java:5938)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)

在網(wǎng)上也看了好多解決辦法,這類的問題發(fā)現(xiàn)的也不多,網(wǎng)上的辦法也不好使,然后就想到了版本問題

我目前有就兩種的解決方案,第一種就是更改對應的版本

我現(xiàn)在使用的版本目前是沒有問題的

    //compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.1'
    //TODO換這個版本就沒問題  否則會出現(xiàn) 線程調度異常
    compile 'com.squareup.okhttp3:okhttp:3.0.1'

然后還有一種解決方案,昨天一不小心就可以了,但是寫Okhttp緩存的時候有一次出現(xiàn)了類似的問題,我先貼出來(我覺得還是版本的問題更大一些)


o.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);

就是這樣

  • 然后就是我自己的代碼,主要還是參考網(wǎng)絡上很多很多文章

緩存的主要目的還是在沒有網(wǎng)絡的情況不至于一片白花花的view,然后就是不用每次都請求下載數(shù)據(jù)

我們還是用OkHttp緩存

上面文章都很明白我直接上代碼就OK
首先就是需要添加addInterceptor和 addNetworkInterceptor這兩個
這兩個現(xiàn)在要必須都設置才能緩存否則的話不行,其他依賴版本的我也沒有試

先說添加的Interceptor
這個主要是設置有網(wǎng)就去網(wǎng)絡,沒網(wǎng)就讀取本地的緩存

 /**
     * 設置返回數(shù)據(jù)的  Interceptor  判斷網(wǎng)絡   沒網(wǎng)讀取緩存
     */
    public Interceptor getInterceptor(){
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                if (!APPNetWork.isNetworkConnected(App.getIntense())) {
                    request = request.newBuilder()
                            .cacheControl(CacheControl.FORCE_CACHE)
                            .build();
                }
                return chain.proceed(request);
            }
        };
    }

另外一個就是NetWorkInterceptor

 /**
     * 設置連接器  設置緩存
     */
    public Interceptor getNetWorkInterceptor (){
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                Response response = chain.proceed(request);
                if (APPNetWork.isNetworkConnected(App.getIntense())) {
                    int maxAge = 0 * 60;
                    // 有網(wǎng)絡時 設置緩存超時時間0個小時
                    response.newBuilder()
                            .header("Cache-Control", "public, max-age=" + maxAge)
                            .removeHeader("Pragma")
                            .build();
                } else {
                    // 無網(wǎng)絡時抖坪,設置超時為1周
                    int maxStale = 60 * 60 * 24 * 7;
                    response.newBuilder()
                            .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                            .removeHeader("Pragma")
                            .build();
                }
                return response;
            }
        };
    }

最后看一下client設置進去就行了

                .addNetworkInterceptor(getNetWorkInterceptor())
                .addInterceptor(getInterceptor())
輸入圖片說明
輸入圖片說明

這個就是緩存文件

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末猖闪,一起剝皮案震驚了整個濱河市蛛枚,隨后出現(xiàn)的幾起案子术荤,更是在濱河造成了極大的恐慌雌澄,老刑警劉巖斋泄,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镐牺,居然都是意外死亡炫掐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門睬涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卒废,“玉大人,你說我怎么就攤上這事宙地∷と希” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵宅粥,是天一觀的道長参袱。 經常有香客問我,道長,這世上最難降的妖魔是什么抹蚀? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任剿牺,我火速辦了婚禮,結果婚禮上环壤,老公的妹妹穿的比我還像新娘晒来。我一直安慰自己,他們只是感情好郑现,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布湃崩。 她就那樣靜靜地躺著,像睡著了一般接箫。 火紅的嫁衣襯著肌膚如雪攒读。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天辛友,我揣著相機與錄音薄扁,去河邊找鬼。 笑死废累,一個胖子當著我的面吹牛邓梅,可吹牛的內容都是我干的。 我是一名探鬼主播邑滨,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼日缨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驼修?” 一聲冷哼從身側響起殿遂,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乙各,沒想到半個月后墨礁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡耳峦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年恩静,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹲坷。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡驶乾,死狀恐怖,靈堂內的尸體忽然破棺而出循签,到底是詐尸還是另有隱情级乐,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布县匠,位于F島的核電站风科,受9級特大地震影響撒轮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜贼穆,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一题山、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧故痊,春花似錦顶瞳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豫领,卻和暖如春抡柿,著一層夾襖步出監(jiān)牢的瞬間舔琅,已是汗流浹背等恐。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留备蚓,地道東北人课蔬。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像郊尝,于是被迫代替她去往敵國和親二跋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容