當前位置:首頁 » 文件管理 » okhttp清理緩存

okhttp清理緩存

發布時間: 2022-11-21 05:59:18

① android okhttp 緩存設置

緩存第一步就是要保存 response 數據到緩存文件中,oktthp 用的是 DiskLruCache 會緩存到文件中。

② OkHttp阻塞式清理線程

1.cleanup方法負責計算清理的時間
-1:代表沒有需要清理的線程
如果清理時間大於0,計算下一次清理的時間(讓線程等待一段時間再執行)

2.System.nanoTime
納秒級別的計時,由於計算機的執行速度很快,所以用納秒來計時更加准確。

3. public final void wait(long timeout, int nanos)
傳入nanos納秒,來減少等待的誤差.1毫秒==1000000納秒,任何1納秒的誤差都將使等待時間加長1毫秒:當nanos>0時,timeout++

③ 如何高效的使用Okhttp

OkHttp 是一個在開發可汗學院Android APP過程中非常重要的依賴庫。它的默認的配置為我們提供了非常重要實用功能,下面一些步驟我們可以讓Okhttp提供更多功能使用靈活和內省能力。

1. 啟用文件系統上的響應緩存

默認情況下,Okhttp不支持響應緩存,包括HTTP Cache-Control頭允許緩存響應。因此,客戶端通過一次又一次的請求相同的資源浪費時間和帶寬。而不是簡單地讀取初始響應後緩存的副本。

要在文件系統中啟用響應緩存,需要配置com.squareup.okhttp.Cache實例,並把它傳遞給你的OkHttpClient實例的setCache方法。你必須初始化緩存與存放目錄的文件,並以位元組為單位的最大值。

響應返回數據可以寫入給定目錄文件,如果一個響應的緩存超過了給定的大小。我們可以採取 LRU policy 。

我們可以在 stackoverflow 查看 Jesse Wilson 的回復。我們可以通過context.getCacheDir()在子目錄中緩存我們的響應:

// Base directory recommended by http://stackoverflow.com/a/32752861/400717.
// Guard against null, which is possible according to
// https://groups.google.com/d/msg/android-developers/-694j87eXVU/YYs4b6kextwJ and
// http://stackoverflow.com/q/4441849/400717.
final @Nullable File baseDir = context.getCacheDir();
if (baseDir != null) {
final File cacheDir = new File(baseDir, "HttpResponseCache");
okHttpClient.setCache(new Cache(cacheDir, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));
}

// Base directory recommended by http://stackoverflow.com/a/32752861/400717.
// Guard against null, which is possible according to
// https://groups.google.com/d/msg/android-developers/-694j87eXVU/YYs4b6kextwJ and
// http://stackoverflow.com/q/4441849/400717.
final @NullableFilebaseDir = context.getCacheDir();
if (baseDir != null) {
final FilecacheDir = new File(baseDir, "HttpResponseCache");
okHttpClient.setCache(new Cache(cacheDir, HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));
}

在可汗學院的程序中我們指定 HTTP_RESPONSE_DISK_CACHE_MAX_SIZE as 10 * 1024 * 1024 , or 10 MB的大小

2. 集成Stetho

Stetho 是Facebook的一個可愛的庫,可以使用Chrome瀏覽器的Chrome開發人員工具功能來檢查你的Andr oid應用程序。

Stetho除了允許你檢查你的應用程序的SQLite資料庫,還可以查看View的層次結構。允許你檢查由OkHttp發起的每個請求和響應:

這種自省機制是確保伺服器返回允許資源緩存的HTTP頭是非常有用的,以及驗證沒有請求時,保證緩存的資源存在。

要想使用Stetho,只需添加一個StethoInterceptor實例的網路攔截器列表:

okHttpClient.networkInterceptors().add(new StethoInterceptor());

okHttpClient.networkInterceptors().add(new StethoInterceptor());

然後,運行應用程序,打開瀏覽器後,輸入chrome://inspect。然後你就會看到應用程序的設備和標識符的列表。然後滑鼠右鍵選擇inspect 打開開發者工具,然後打開新的tab,開始監控OkHttp請求。

3. 使用Picasso 和 Retrofit

你可能使用過 Picasso 來載入網路圖片,或者使用 Retrofit 來簡化發出請求和解碼響應。這些第三方庫將隱式地創建自己的OkHttpClient供內部使用,如果你不明確指定一個。

Picasso version 2.5.2的OkHttpDownloader類:

private static OkHttpClient defaultOkHttpClient() {
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
return client;
}

private static () {
OkHttpClientclient = new OkHttpClient();
client.setConnectTimeout(Utils.DEFAULT_CONNECT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setReadTimeout(Utils.DEFAULT_READ_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
client.setWriteTimeout(Utils.DEFAULT_WRITE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
return client;
}

Retrofit也有類似的工廠方法來創建自己的OkHttpClient。

圖片一般在應用程序中需要載入的比較大的資源。盡管Picasso自己維護它的LRU機制來緩存圖片,在內存中嚴格執行。如果客戶端嘗試使用Picasso來載入圖片。Picasso會找不到其在內存中緩存圖像,然後將委託載入該圖片到它的內部OkHttpClient實例。並且默認情況下該實例將始終從伺服器載入圖片資源。

作為defaultOkHttpClient的方法不能與上面提到的文件系統中的響應緩存配置結合起來。

指定你自己的OkHttpClient實例允許返回數據從文件系統緩存響應,圖片不會從伺服器載入。這是非常重要的在程序第一次啟動以後。這個時候Picasso的內存緩存是冷的。所以它會頻繁的委託OkHttpClient實例去載入圖片。

這就需要構建配置了您Picasso 的OkHttpClient實例,如果你在你的代碼中使用

Picasso.with(context).load(...)

Picasso.with(context).load(...)

載入圖片,你是用的是Picasso的單例模式。這是通過with方法懶漢模式地實例化並配置自己的OkHttpClient。因此,我們必須使我們自己的Picasso實例在單例之前通過wiht方法調用。

實現這個,可以簡單的將OkHttpClient實例封裝在OkHttpDownloader中,然後傳遞給 Picasso.Builder 實例的downloader方法。

final Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttpDownloader(okHttpClient))
.build();

// The client should inject this instance whenever it is needed, but replace the singleton
// instance just in case.
Picasso.setSingletonInstance(picasso);

final Picassopicasso = new Picasso.Builder(context)
.downloader(new OkHttpDownloader(okHttpClient))
.build();

// The client should inject this instance whenever it is needed, but replace the singleton
// instance just in case.
Picasso.setSingletonInstance(picasso);

在Retrofit中要使用OkHttpClient實例,需要改造1.9.x的一個RestAdapter,需要將OkHttpClient封裝OkClient的實例中。然後把它傳遞給RestAdapter.Builder實例的setClient方法。

restAdapterBuilder.setClient(new OkClient(httpClient));

restAdapterBuilder.setClient(new OkClient(httpClient));

在 Retrofit 2.0中只需要簡單的將OkHttpClient傳遞給Retrofit.Builder實例的client方法。

在可汗學院的APP中我們通過 Dagger 依賴注入來確保我們只有一個OkHttpClient的實例。這種方法同樣也適用於Picasso和Retrofit我們提供了一個為OkHttpClient實例提供單例模式的註解示例:

@Provides
@Singleton
public OkHttpClient okHttpClient(final Context context, ...) {
final OkHttpClient okHttpClient = new OkHttpClient();
configureClient(okHttpClient, ...);
return okHttpClient;
}

@Provides
@Singleton
public OkHttpClientokHttpClient(final Contextcontext, ...) {
final OkHttpClientokHttpClient = new OkHttpClient();
configureClient(okHttpClient, ...);
return okHttpClient;
}

OkHttpClient將會通過Dagger的註解創建一個實例提供給我們的Picasso和Retrofit。

4.指定一個用戶代理攔截器

日誌文件和分析為我們提供了更多有用的信息,當客戶在每個請求提供詳細的User-Agent
header值的時候。默認情況下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。為了指定我們自己的user
agent。首先創建攔截器的替換值, 我們可以看stackoverflow的建議 。

public final class UserAgentInterceptor implements Interceptor {
private static final String USER_AGENT_HEADER_NAME = "User-Agent";
private final String userAgentHeaderValue;

public UserAgentInterceptor(String userAgentHeaderValue) {
this.userAgentHeaderValue = Preconditions.checkNotNull(userAgentHeaderValue);
}

@Override
public Response intercept(Chain chain) throws IOException {
final Request originalRequest = chain.request();
final Request requestWithUserAgent = originalRequest.newBuilder()
.removeHeader(USER_AGENT_HEADER_NAME)
.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
.build();
return chain.proceed(requestWithUserAgent);
}
}

public final class UserAgentInterceptor implements Interceptor {
private static final String USER_AGENT_HEADER_NAME = "User-Agent";
private final String userAgentHeaderValue;

public UserAgentInterceptor(String userAgentHeaderValue) {
this.userAgentHeaderValue = Preconditions.checkNotNull(userAgentHeaderValue);
}

@Override
public Responseintercept(Chainchain) throws IOException {
final RequestoriginalRequest = chain.request();
final RequestrequestWithUserAgent = originalRequest.newBuilder()
.removeHeader(USER_AGENT_HEADER_NAME)
.addHeader(USER_AGENT_HEADER_NAME, userAgentHeaderValue)
.build();
return chain.proceed(requestWithUserAgent);
}
}

為了創建User-Agent header值人然後傳遞給UserAgentInterceptor的構造器,使用你得到的任何信息。

我們可以使用:

android 的系統信息可以清晰的傳遞出這是一台android 設備
Build.MODEL 或者「製造商提供的用戶可見最終可見的名稱」
Build.BRAND或者「消費者可見的品牌與產品/硬體相關信息」
Build.VERSION.SDK_INT或者「消費者可見的Android提供的SDK版本號」
BuildConfig.APPLICATION_ID
BuildConfig.VERSION_NAME
BuildConfig.VERSION_CODE

最後三個值由的applicationID,VERSIONCODE和VERSIONNAME的值在我們的Gradle build腳本

了解更多信息可以查看 versioning your applications 和 configuring your applicationId with Gradle

請注意,如果您的應用程序使用的是WebView,您可以配置使用相同的 User-Agent header值,你可以通過下面方法創建UserAgentInterceptor:

WebSettings settings = webView.getSettings();
settings.setUserAgentString(userAgentHeaderValue);

WebSettingssettings = webView.getSettings();
settings.setUserAgentString(userAgentHeaderValue);

5.指定合理的超時

2.5.0版本之前,OkHttp請求默認為永不超時。2.5.0版本開始如果建立連接請求超時,如果從連接讀取下一個位元組或寫入的下一個位元組到連接,花費超過10秒,就終止。這樣做需要更新到2.5.0版本我們就不需要在我們的代碼中修改bug。原因很簡單是我因為我們第一次使用的時候使用了錯誤的路徑。

要覆蓋這些默認值,可以分別調用setConnectTimeout,setReadTimeout或setWriteTimeout。

需要注意的是Picasso和Retrofit為OkHttpClient實例指定不同的超時值時,默認情況下,Picasso指定:

連接超過15秒.
讀取超過20秒
寫入超過20秒

而Retrofit指定:

連接超過15秒.
讀取超過20秒
沒有寫入超時

通過配置Picasso和Retrofit自己的OkHttpClient實例你可以確保所有的請求超時是一致的

④ okhttp怎麼解決post緩存

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self CellTaxiTextForStarting:@"beijing" andDestination:@"Bibb" andUid:131]; } - (void)didReceiveMemoryWarning 。

⑤ Okhttp解析(五)緩存的處理

大家好,之前我們講解了Okhttp網路數據請求相關的內容,這一節我們講講數據緩存的處理。本節按以下內容講解Okhttp緩存相關的內容。

緩存的使用場景很多,通過它可以將數據通過一定的規則存儲起來,再次請求數據的時候就可以快速從緩存中讀取了,緩存有以下優勢。

HTTP本身提供了一套緩存相關的機制。這套機制定義了相關的欄位和規則,用來客戶端和服務端進行緩存相關的協商,如響應的數據是否需要緩存,緩存有效期,緩存是否有效,伺服器端給出指示,而客戶端則根據服務端的指示做具體的緩存更新和讀取緩存工作。http緩存可以分為兩類:

強制緩存,在緩存數據未失效的情況下,可以直接使用緩存數據,有兩個欄位Expires和Cache-Control用於標明失效規則。

表示過期時間,由服務端返回。那麼下次請求數據時,判斷這個Expires過期時間是否已經過了,如果還沒有到過期時間,則使用緩存,如果過了過期時間,則重新請求伺服器的數據。Expires格式如下:

不過因為伺服器和客戶端的時間並不是同步的,用一個絕對時間作為過期的標記並不是很明智,所以HTTP1.1之後更多的是Cache-Control,它的控制更加靈活。

表示緩存的控制,有服務端返回。它有以下幾個取值:

默認情況下是private,也就是不能共享的。Cache-Control格式如下:

對比緩存,表示需要和服務端進行相關信息的對比,由伺服器決定是使用緩存還是最新內容,如果伺服器判定使用緩存,返回響應嗎304,判定使用最新內容,則返回響應碼200和最新數據。對比緩存的判定欄位有兩組:

ETag表示資源的一種標識信息,用於標識某個資源,由服務端返回,優先順序更高。格式如下:

然後客戶端再次請求時,加入欄位If-None-Match,格式如下:

服務端收到請求的該欄位時(之前的Etag值),和資源的唯一標識進行對比,如果相同,說明沒有改動,則返回狀態碼304,如果不同,說明資源被改過了,則返回狀態碼200和整個內容數據。

Last-Modified表示資源的最近修改時間,由服務端返回,優先順序更低。格式如下:

Last-Modified
由伺服器返回,表示響應的數據最近修改的時間。


If-Modified-Since
由客戶端請求,表示詢問伺服器這個時間是不是上次修改的時間。如果服務端該資源的修改時間小於等於If-Modified-Since指定的時間,說明資源沒有改動,返回響應狀態碼304,可以使用緩存。如果服務端該資源的修改時間大於If-Modified-Since指定的時間,說明資源又有改動了,則返回響應狀態碼200和最新數據給客戶端,客戶端使用響應返回的最新數據。

Last-Modified欄位的值(服務端返回的資源上次修改時間),常常被用於客戶端下次請求時的If-Modified-Since欄位中。

HTTP的緩存規則是優先考慮強制緩存,然後考慮對比緩存。

Okhttp緩存相關的類有如下:

要開啟使用Okhttp的緩存其實很簡單,只需要給OkHttpClient對象設置一個Cache對象即可,創建一個Cache時指定緩存保存的目錄和緩存最大的大小即可。

那麼下面我們來看看Okhttp緩存執行的大概流程

Okhttp的緩存流程分為讀取緩存和存儲緩存兩個過程,我們分別分析。

讀取使用緩存的流程從HttpEngine的sendRequest發送請求開始。

接下來我們分析

從Cache的get方法開始。它按以下步驟進行。

如果存在緩存的話,在指定的緩存目錄中,會有兩個文件「****.0」和「****.1」,分別存儲某個請求緩存的響應頭和響應體信息。(「****」是url的md5加密值)對應的ENTRY_METADATA響應頭和ENTRY_BODY響應體。緩存的讀取其實是由DiskLruCache來讀取的,DiskLruCache是支持Lru(最近最少訪問)規則的用於磁碟存儲的類,對應LruCache內存存儲。它在存儲的內容超過指定值之後,就會根據最近最少訪問的規則,把最近最少訪問的數據移除,以達到總大小不超過限制的目的。

接下來我們分析CacheStrategy緩存策略是怎麼判定的。

直接看CacheStrategy的get方法。緩存策略是由請求和緩存響應共同決定的。

接來下我們看看CacheControl類里有些什麼。

可以發現,它就是用於描述響應的緩存控制信息。

然後我們再看看Okhttp存儲緩存是怎麼進行的。

存儲緩存的流程從HttpEngine的readResponse發送請求開始的。

可以看到這里先通過maybeCache寫入了響應頭信息,再通過cacheWritingResponse寫入了響應體信息。我們再進去看Cache的put方法實現。

我們繼續看Cache的writeTo方法,可以看到是寫入一些響應頭信息。

到這里Okhttp緩存的讀取和存儲流程我們就清楚了。可以說,緩存的使用策略基本都是按照HTTP的緩存定義來實現的,所以對HTTP緩存相關欄位的理解是很重要的。然後關於DiskLruCache是如何管理緩存文件的,這個其實也很好理解,首先的原則就是按照LRU這種最近最少使用刪除的原則,當總的大小超過限定大小後,刪除最近最少使用的緩存文件,它的LRU演算法是使用LinkedHashMap進行維護的,這樣來保證,保留的緩存文件都是更常使用的。具體實現大家可以分析DiskLruCache和LinkedHashMap的實現原理。

⑥ okhttp3封裝工具類怎麼刪除緩存

系統數據類——系統文件存儲相關文件夾1、.android_secure:官方app2sd的產物,存儲了相關的軟體使用認證驗證,刪除之後SD卡中的軟體將無法使用。2、Android:存放重要的程序數據,比如google:map的地圖緩存,誤刪掉後地圖還需重新下載。3、backups:包含重要的備份文件,比如聯系人導出到SD卡會導入到此文件夾。4、bugtogo:系統出現問題的時候會形成一些報告文件,存放在此文件夾。5、data:緩存數據文件夾,與Android類似。例如,「截圖助手」截圖保存在data\com.edwardkim.android.screenshotitfull\screenshots里。6、LOST.DIR:卡上丟失或出錯的文件會移動到這里,此目錄刪了會自動生成。7、SystemAppBackup:SystemAppremove(深度卸載)備份系統文件後,備份文件保存的目錄。8、bugreports:升級系統或刷機,系統和程序發生兼容錯誤報告列表(包括內存使用全部內容)將保存在這個文件,重起機器可以刪除。9、.keepsafe:隱藏類的軟體、加密保存文件地址存放於此。10、.thumbs:瀏覽或使用某一軟體,以及使用某一文件夾後用於記錄次數和內容的文件,隨機產生,需要定期不斷清除,長時間不清理會大量佔用儲存卡的有效空間。11、openfeint:打開聯接網路後的一個啟動程序,它廣泛植入移動類平台發布的軟體或游戲,是更新下載或評論反饋信息的記錄地址,可刪除。12、com:播放類軟體在收看播放影視節目生成的文件將存放於此,可以對製作方反映回饋信息,可以刪除。13、Download(download):大寫字母的是網路聯接下載文件目錄,小寫字母的是手機自身(藍牙,近場等)存放下載傳輸文件,不要誤刪。系統工具類——系統自帶工具相關文件夾1、albumart:音樂專輯封面的緩存文件夾。2、albums:相冊縮略圖的緩存文件夾。3、cmp:音樂的緩存文件夾。4、Playlists:播放列表的緩存文件夾。5、DCIM:相機隨機緩存文件夾,記錄功能設置的參數,需要及時清理。一些第三方相機軟體拍出的相片也會保存在這里,比如360或暈影相機等。6、VPN:VPN數據的緩存目錄。7、Mydocuments:手機啟用各種程序任務記錄的文檔,需要定期清除,長時間不清理會佔用SD卡較大內存。8、.nomedia:手機中隱藏的音頻、圖片文件夾都會在這里顯示,可以自設在相關文件夾中。9、media:使用電話通話錄音軟體或在線瀏覽視頻等媒體產生的音頻文件記錄存檔將保存在此。10、.medieval_software:啟用藍牙傳輸軟體時,記錄任務保存文件的目錄。11、extracted:解壓縮軟體默認的解壓目錄。三方應用類1、.mobo:Moboplayer的緩存文件。2、.QQ:QQ的緩存文件,需要定期清除。3、.quickoffice:quickoffice的緩存文件。4、.switchpro:switchprowidget(多鍵開關應用)的緩存文件。5、.ucdlres:UC迅雷的緩存文件。6、:掌上網路、網路輸入法之類程序的緩存文件夾。7、etouch:易行的緩存文件夾。8、documents:DocumentsToGo的相關文件夾。9、gameloft:gameloft游戲數據包存放的文件夾。10、handcent:handcent(超級簡訊)數據文件夾。11、handyCurrency:貨幣匯率相關的文件夾,裝了handycalc(科學計算器)之後才會有。12、ireader:ireader的緩存文件夾。13、KingReader:開卷有益的緩存文件夾:下載的文件和應用都在這兒:刪除時留意看清14、LazyList:Applanet的緩存目錄,慎重使用。15、moji:墨跡天氣的緩存目錄。16、MusicFolders:poweramp產生的緩存文件夾。17、openfeint:openfeint的緩存文件夾。18、Picstore:圖片瀏覽軟體建立的一個目錄。19、renren:人人網客戶端的緩存文件夾。20、screenshot:截屏圖片保存的目錄。21、ShootMe:shootme截屏後圖片文件保存的目錄。22、SmartpixGames:SmartpixGames出品游戲的緩存文件夾,比如Jewellust。23、sogou:搜狗拼音輸入法的隨機緩存文件夾,可以刪除。24、SpeedSoftware:RE文件管理器的緩存文件夾。25、TalkingFriends:talkingtom(會說話的tom貓)錄制的視頻文件所保存的目錄。26、Tencent:騰訊軟體的緩存目錄,比如QQ。(與上面的.QQ文件夾並不相同)27、TitaniumBackup:鈦備份備份的程序所保存的目錄。28、TunnyBrowser:感覺是海豚瀏覽器的緩存目錄,但為什麼叫這個名字?金槍魚瀏覽器。.29、UCDLFiles:UC迅雷下載文件的保存目錄。30、UCDownloads:UC瀏覽器下載文件緩存的保存目錄。31、VIE:Vignette(暈影相機)的緩存目錄。32、yd_historys:有道詞典搜索歷史的緩存目錄33、yd_speech:有道詞典單詞發音的緩存目錄。34、youmicache:刪掉後還會自動生成,悠米廣告的緩存目錄,廣告程序內嵌在其程序中。35、Glu:Glu系列游戲的資料包存放地,如3D獵鹿人,勇猛二兄弟等。36、apadqq-images:QQforpad的緩存目錄。37、DunDef:地牢守護者的數據包。38、KuwoMusic:酷我音樂的相關文件夾。39、MxBrowser:遨遊的緩存目錄。40、Camera360:相機camera360的隨機緩存目錄,可以定期清除。41、TTPod:天天動聽的緩存目錄。42、downloaded:刷了MIUI,升級後的ZIP刷機包,保存在downloaded_rom里。43、.estrongs:當你使用了ES文件管理器解壓文件,會有這個緩存記錄。它反映使用進程,可以刪除。44、silentR:用了後台錄音軟體,自生的音頻文件夾,子文件夾phoneCalls,定期管理清除45、3D-compass:這是使用實景指南針軟體,生成的景象圖片(圖像和數字比較詳細)文件夾,可以清除。46、PDF:可移植文檔格式,Pdf閱讀器存儲文件夾。47、Zidanyou:是字典的詞庫文件儲存,刪除了要重新下載詞庫。48、Callrecords:採用第三方強制雙向錄音軟體(手機未root),音頻文件保存。49、VPlayerPro:是MOBO等視頻播放器使用後的記錄定期刪除。50、BeWeather(Videos):是氣象類軟體(如黑莓天氣.。.等)附加下載音頻或動畫圖標的儲存地址,刪除了會無圖無聲顯示。51、thumbnails:用第三方播放器觀看手持移動類視頻媒體時,存放點擊暫停、隨機截圖以及文件儲存時產生的內容。52、iQuran(meta2):可蘭經瀏覽文本和音頻的儲存文件。53、Autodesk:手機系統自帶存儲器命令生成文件夾:儲存圖像或編寫文稿,可以查看、備份或者刪除。54、PixlrOMatic:後期特效處理圖片軟體Pixlo,儲存文件夾,打開可以預覽看效果。55、mapbar:圖吧導航地圖存放文件,有必須主文件和不同地區具體地圖,主文件刪掉要重下!56、antTTS:是使用了高德導航選擇語音種類導航、語種的下載地址,刪掉了語音提示會丟失。57、kingsoft:金山詞霸專用文件夾下載儲存詞庫、更新拓展文匯(官方發布修正補充)。58、NightVisionCamera:夜間拍照相機相片存放的地址。59、DSA:電子狗專用夾,收錄各地區道路探頭監控位置信息,會定期更新。已測試配合高德、凱立德提前預警,效果不錯。60、apexlauncher:尖端桌面啟動器文件夾,位置在andriod/data/,放置桌面設置備份bak文件。

⑦ OkHttp的使用總結

dependencies{
//...
//OkHttp
implementation'com.squareup.okhttp3:okhttp:3.14.2'
implementation'com.squareup.okio:okio:1.17.4'
}
需要注意OkHttp在3.13.x以上的版本需要在Android 5.0+和java1.8的環境開發。Okio在1.x版本是基於Java實現的,2.x則是Kotlin實現的。

OkHttpClient:客戶端對象
Request:訪問請求,Post請求中需要包含RequestBody
RequestBody:請求數據,在Post請求中用到
Response:網路請求的響應結果
Interceptor:攔截器,能夠監控,重寫以及重試(請求的)調用
MediaType:數據類型,用來表明數據是json,image,pdf等一系列格式
client.newCall(request).execute():同步的請求方法。
client.newCall(request).enqueue(Callback callback):非同步的請求方法
注意點:Callback是執行在子線程中的,不能在此更新UI操作,okhttp2.2以後才有攔截器的概念。

1.同步get:需要自己寫子線程請求

2.非同步get

說明:Request.Builder 中默認使用get請求,所以可以不調用get()方法

3.post請求

其中RequestBody可以是JSON,表單,鍵值對,文件等

表單

基本流程都是先創建一個OkHttpClient對象,然後通過Request.Builder()創建一個Request對象,OkHttpClient對象調用newCall()並傳入Request對象就能Call對象。而同步和非同步不同的地方在於execute()和enqueue()方法的調用,調用execute()為同步請求並返回Response對象,調用enqueue()方法通過callback的形式返回Response對象。
其中這兩個方法最終會調用RealCall總的
()方法,從攔截器鏈中獲取返回結果;攔截器鏈中,依次通過RetryAndFollowUpInterceptor、BridgeInterceptor、CacheInterceptor、ConnectInterceptor、CallServerInterceptor,與伺服器建立連接後,獲取返回數據,在經過上述攔截器依次處理後,最後將結果返回給調用方。

攔截器的作用:可以在應用拿到response之前,先獲得response,對其某些數據進行監控,在有必要的情況下,對response中某些內容比如response的header,body,response內的request的header,body進行更改。

重拾及重定向攔截器RetryAndFollowUpInterceptor: 負責請求的重試和重定向
橋接攔截器BridgeInterceptor:給請求添加對用的header信息,處理響應結果的header信息
緩存攔截器CacheInterceptor:根據當前獲取的狀態選擇網路請求、讀取緩存、更新緩存。
連接攔截器ConnectInterceptor:建立http連接。
讀寫攔截器CallServerInterceptor:通過連接好的通道進行數據的交換;

1)ApplicationInterceptor(應用攔截器)
2)NetworkInterceptor(網路攔截器)
應用攔截器作用於okhttpCore和Application之間,網路攔截器作用於network和okhttpCore之間,添加應用攔截器的介面是addInterceptor(),而添加網路攔截器的介面是addNetworkInterceptor();

NetworkInterceptor:記錄日誌
ApplicationInterceptor:動態添加請求公共參數,檢查請求路徑許可權(如是否登錄狀態)
說明:在某些特殊情況下,網路攔截器可能被執行多次,但是applicationInterceptor只會被執行一次。

addHeader(String name, String value) :添加header信息
removeHeader(String name):移除header信息
header(String name, String value):重新設置指定name的header信息
headers(Headers headers):移除原有的header信息,將參數headers添加到請求中

⑧ android okhttp怎麼刪除緩存

okhttp在3.0之後緩存時間很短,十幾秒,只有設置lurcache時才可以長時間緩存,清除緩存可以將lrucache清除

⑨ 網路請求框架-OkHttp原理解析

okhttp是square公司貢獻的一個處理網路請求的開源框架,是目前Android開發使用最廣泛的一個網路框架,從Android4.4開始,httpURLconnection的底層實現採用的就是okhttp。內部實現就是利用java基礎,對socket進行封裝,實現http通信。最重要的兩個關鍵點就是分發器和5個攔截器。
分發器 就是內部維護隊列和線程池,完成請求分配,總結就是用於對非同步任務加入隊列管理,然後判斷條件,控制數量,加入線程池執行非同步請求任務。
五個默認攔截器 就是利用責任鏈模式對網路請求進行層層處理,完成整個請求過程,簡單總結如下。
1.橋接攔截器對用戶發出的請求添加缺少的請求配置欄位,比如keep-alive等
2.緩存攔截器就是查詢有沒有符合判斷條件的已緩存的網路請求,執行復用,直接返回response
3.連接攔截器就是創建請求,加入連接器 或者訪問連接池,根據條件判斷,是否能懟已創建的tcp請求進行復用
4.請求伺服器攔截器就是對scoket進行操作,請求網路訪問伺服器,返回response,
5.重試和重定向攔截器就是對返回的response進行code判斷,決定是否要重試或者重定向操作。

1.支持http2.0版本,並且允許對同一主機的所有請求共享一個套接字
2.即使不是http2.0版本,通過連接池,減少請求延遲
3.默認使用Gzip 壓縮數據
4.響應緩存,避免重復請求網路

最簡單的http請求案例

1.利用建造者模式構建okHttpClient實例對象,構建過程中可以動態配置參數,請求時間,響應時間,緩存信息等。
2.創建Request對象,設置請求方式,鏈接地址,參數等信息。
3.把request對象,傳給client,通過newCall函數,得到RealCall對象。

4.RealCall 分為同步和非同步執行
5.同步執行時,分發器只是做個記錄,把請求任務加到隊列中,然後直接通過攔截器訪問伺服器,返回response。

6.非同步執行
6.1先對非同步任務進一步封裝,把任務放到AsyncCall對象中

2.分發器 把 封裝後的非同步任務 添加到等待運行的隊列中

7. 通過攔截器,獲取response
okhttp 默認提供5個攔截器 重試重定向攔截器,橋接攔截器,緩存攔截器,連接攔截器,訪問伺服器攔截器。還可以自定義攔截器。
自定義攔截器分為應用攔截器(通過addInterceptor 添加)和網路攔截器(通過addNetworkInterceptor攔截)

攔截器採用責任鏈的設計默認,讓請求者和處理者解耦,最終請求從前往後,響應從後往前。

首先先判斷用戶是否取消了請求,如果沒有取消,就把請求交個橋接攔截器。
在獲得響應結果response的時候根據響應碼,判斷是否需要重試或者重定向, 重試不限制次數,重定向最多20次 ,如果需要重試或者重定向,那麼會再一次重新執行所有攔截器。
有如下幾種情況不會重試:IO異常,線路異常,配置client實例時配置不允許重試,協議異常,證書異常等等。

先獲取用戶發送的請求,判斷條件用戶是否已經配置過請求頭欄位,若用戶沒有配置,則將http協議必備的請求頭欄位補齊,比如Content-Type,Content-Length等,然後交給下一個攔截器。
在獲得響應結果response之後,調用保存cookie的介面(也可以在配置client的時候,設置cookjar進行cookie回調數據),並且解析gzip數據

獲取結果之後,對cookie進行保存,對返回的數據進行gzip解壓

就是根據緩存策略從緩存中查找是否有合適的緩存response,如果有合適的緩存,直接返回給請求任務,不在繼續執行後面的攔截器。
獲得響應結果response後,根據條件判斷,決定是否要緩存。

維護一個連接池,負責對連接的服務。在把請求交給下一個攔截器之前。會先在連接池中找到一個合適的連接(滿足適配條件相同,並且沒有正在被使用)或者新建一個連接,並且接入連接池,獲得對應的socket流,把請求交給下一個攔截器。獲得response結果後不會進行額外的處理。

連接池, 也稱之為對象池,主要用來存放request請求連接,內部維護了一個LinkedQueue隊列用來存放請求。在添加新的請求對象時,都會執行一個周期性任務,用以對連接池進行清理操作。
1.隊列長度超過5,清理最近未被使用連接,LRE演算法
2.存儲的連接,5分鍾未被復用,清理

拿到上一個攔截器返回的請求,真正的與伺服器進行通信,向伺服器發送數據,解析讀取響應的數據,返回給上一個攔截器。

1.創建request =>OkHttpClient=>RealCall()
2.同步執行 ,分發器添加同步任務,執行攔截器,訪問伺服器,返回reponse,觸發非同步分發流程。
3.非同步執行 ,封裝任務= >AsyncCall ,實現runnable介面。添加任務到非同步任務等待隊列,執行分發任務,判斷非同步任務是否能加入正在執行的非同步任務隊列,滿足兩個條件
同時執行的非同步任務數量不得大於64個
對同一個主機的訪問任務,最多不得大於5個
4.加入正在執行的非同步任務隊列,通過線程池執行任務,經過5個默認攔截器訪問伺服器,返回response,執行非同步任務分發。

分發器工作 分為同步任務和非同步任務兩種
同步任務 就是把任務加入同步任務隊列,加個標記,執行結束之後,觸發非同步任務的分發操作。
非同步任務 先封裝任務到asyncCall對象,實現了runnable介面。把任務加入等待執行隊列,執行分發操作。
先遍歷等待任務隊列,判斷是否符合加入正在運行的非同步任務隊列,要同時滿足兩個條件。
同時執行的非同步任務數量不得大於64個
對同一個主機的訪問任務,最多不得大於5個
當滿足條件後,從等待隊列中刪除任務,把任務加入正在執行的隊列中,通過自定義的線程池,執行任務,任務執行結束後,再次執行分發操作。

攔截器採用了責任鏈設計默認,讓請求者和執行者解耦,請求者只需要將請求發給責任鏈即可,無需關心請求過程和細節。okHttp 默認有5個攔截器,重試重定向攔截器,橋接攔截器,緩存攔截器,連接攔截器,請求服務攔截器。工作細節參考上面攔截器原理分析部分

1.位置的關系,應用攔截器 放在責任鏈最頂端,網路攔截器放在責任鏈倒數第二的位置。所以應用攔截器 最先攔截,最後響應,網路攔截器 倒數第二攔截,第二響應。如果列印請求日誌的情況,應用攔截器列印的是用戶請求信息,經過重試重定向,橋接,緩存,鏈接 等攔截器的層層包裝,網路攔截器列印的是實際請求的信息。
2.應用攔截器一定會被執行,網路攔截器不一定被執行。

利用連接池,緩存所有的有效連接對象。
清理機制:垃圾連接
1.超過5分鍾沒有用過的鏈接
2.超過5個閑置鏈接後,從最久閑置的鏈接開始執行清理(LRU)

⑩ OkHttp 緩存實戰

在實際業務中可能某些查詢數據,不經常變化,為了節省流量、提高響應速度和增強用戶體驗等,把變化頻率小的數據緩存到本地,以實現復用。

OkHttp 的緩存功能使用起來也比較簡單和靈活,接下來我們就來看看

配置緩存首先需要創建一個 Cache 對象,並且指定緩存目錄和緩存大小,然後,調用用 OkHttpClient.Builder() 的 cache() 方法來配置創建的緩存對象。如下所示:

如果在服務端的介面響應中包含了合適 Cache-Control 響應頭,那麼, OkHttp 就會默認按此響應頭,對數據進行緩存。

Cache-Control 響應頭是緩存的一個重點,如果包含了此響應頭,在網路請求時,會首先判斷緩存是否有效,若有效則直接讀取緩存數據,如果失效則會重新請求介面數據。

有些服務端介面,比如老介面或第三方介面,在響應頭中不包含 Cache-Control ,或者緩存已被禁用。這種情況下要想讓緩存功能正常工作,就需要使用自定義攔截器,通過攔截器在給請求的響應中添加合適的 Cache-Control 響應頭即可。如下所示:

以上情況,無論是服務端響應包含 Cache-Control 頭信息,還是通過攔截器設置的此頭信息都屬於全局配置,即所有的請求都會緩存,且緩存的時間相同。在實際業務中,可能是有些介面不需要緩存,或者不同介面要求緩存的時間要求不同。要解決這個問題有如下兩種辦法:

OkHttp 提供了如下兩種默認的緩存控制器:

除了上面提供的默認緩存控制器外,還可以通過 CacheControl.Builder() 構建自定義的緩存控制器,可選的設置方法如下:

構建一個自定義緩存器如下所示:

當通過 CacheControl 類設置的緩存時間大於 Cache-Control 響應頭時間時,緩存的有效時間為 Cache-Control 響應頭時間,否則使用 CacheControl 類設置的時間。

基於此,所以我們可以給有需要的介面請求通過 CacheControl 類設置緩存策略,然後在攔截器中判斷請求是否包含 Cache-Control 請求頭,如果有就把 Cache-Control 請求頭添加到響應中去,這樣問題就解決了,修改後的攔截器如下:

在 OkHttp 中也可以使用緩存來減少網路請求。在 OkHttp 可以通過響應頭中的 Cache-Control 控制緩存的有效時間,在服務端無法提供 Cache-Control 響應頭時,可以通過自定義攔截器,在攔截器中對請求響應添加 Cache-Control 響應頭。因為在攔截器中添加的響應頭對所有的請求都生效,並且緩存策略相同,如果想不同的請求緩存控制不同,可以通過在 構造 Request 對象時,設置 CacheControl 對象,構建個性化緩存控制策略。

熱點內容
魔獸世界退役伺服器有什麼用處 發布:2024-10-05 20:50:00 瀏覽:194
新車配置不符怎麼投訴 發布:2024-10-05 20:49:00 瀏覽:388
編譯的html文件 發布:2024-10-05 20:48:58 瀏覽:160
python自學網站 發布:2024-10-05 20:46:08 瀏覽:18
存儲在rom中的數據當計算機斷電後 發布:2024-10-05 20:43:46 瀏覽:9
炒股編程代碼 發布:2024-10-05 20:29:10 瀏覽:275
防火門報配置錯誤是什麼原因 發布:2024-10-05 20:20:47 瀏覽:886
移動寬頻設置路由器怎麼設置密碼 發布:2024-10-05 20:03:30 瀏覽:105
微指令的編譯方法有哪一些 發布:2024-10-05 19:02:10 瀏覽:885
android離線定位 發布:2024-10-05 18:36:40 瀏覽:860