當前位置:首頁 » 文件管理 » picasso的緩存機制

picasso的緩存機制

發布時間: 2022-02-28 18:31:47

⑴ Android Picasso 的緩存怎麼清理

可以查詢清理緩存路徑

⑵ android中設置的picasso為什麼不能顯示

圖片為安卓應用添加了必備內容和視覺風格。Picasso允許應用程序載入圖片——往往只需一行代碼!
Picasso.with(context).load("url").into(imageView);
Picasso會自動處理安卓載入圖片時出現的許多常見缺陷:
1.在適配器中處理ImageView循環和下載取消。
2.保證最小內存使用率情況下的復雜圖片轉換。
3.自動內存和磁碟高速緩存。
特性
適配器下載
可以自動檢測適配器復用
@Override public void getView(int position, View convertView, ViewGroup parent) {

SquaredImageView view = (SquaredImageView) convertView;

if (view == null) {
view = new SquaredImageView(context);
}

String url = getItem(position);
Picasso.with(context).load(url).into(view);

}
圖像變換
變換圖像可以更好地適應布局,並且減少內存大小。
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
可以指定自定義變化以便達到更好效果。
public class CropSquareTransformation implements Transformation {

@Override public Bitmap transform(Bitmap source) {

int size = Math.min(source.getWidth(), source.getHeight());

int x = (source.getWidth() - size) / 2;

int y = (source.getHeight() - size) / 2;

Bitmap result = Bitmap.createBitmap(source, x, y, size, size);

if (result != source) {

source.recycle();

}

return result;

}


@Override public String key() { return "square()"; }

}把該類的實例傳遞給變換方法。

佔位符
Picasso把下載和錯誤佔位符作為可選功能。
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
在顯示錯誤佔位符前請求會重試三次。


資源載入
資源,資產,文件,內容供應商均可作為圖像源。
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);

Picasso.with(context).load(new File(...)).into(imageView2);

DEBUG指標
開發時可以啟用綵帶來指示圖像源。在Picasso實例中調用setIndicatorsEnabled(true)。

⑶ android Picasso如何監聽圖片載入完成

優秀的圖片載入框架不要太多,什麼UIL , Volley ,Picasso,Imageloader等等。但是作為一名合格的程序猿,必須懂其中的實現原理,於是乎,今天我就帶大家一起來設計一個載入網路、本地的圖片框架。有人可能會說,自己寫會不會很渣,運行效率,內存溢出神馬的。放心,我們拿demo說話,拼得就是速度,奏事這么任性。
好了,如果你看過之前的博文,類似Android Handler 非同步消息處理機制的妙用 創建強大的圖片載入類,可能會對接下來文章理解會有很大的幫助。沒有的話,就跟我往下繼續走吧,也不要去看了。
關於載入本地圖片,當然了,我手機圖片比較少,7000來張:
1、首先肯定不能內存溢出,但是尼瑪現在像素那麼高,怎麼才能保證呢?我相信利用LruCache統一管理你的圖片是個不二的選擇,所有的圖片從LruCache裡面取,保證所有的圖片的內存不會超過預設的空間。
2、載入速度要剛剛的,我一用力,滑動到3000張的位置,你要是還在從第一張給我載入,尼瑪,你以為我打dota呢。所以我們需要引入載入策略,我們不能FIFO,我們選擇LIFO,當前呈現給用戶的,最新載入;當前未呈現的,選擇載入。
3、使用方便。一般圖片都會使用GridView作為控制項,在getView裡面進行圖片載入,當然了為了不錯亂,可能還需要用戶去自己setTag,自己寫回調設置圖片。當然了,我們不需要這么麻煩,一句話IoadImage(imageview,path)即可,剩下的請交給我們的圖片載入框架處理。
做到以上幾點,關於本地的圖片載入應該就木有什麼問題了。
關於載入網路圖片,其實原理差不多,就多了個是否啟用硬碟緩存的選項,如果啟用了,載入時,先從內存中查找,然後從硬碟上找,最後去網路下載。下載完成後,別忘了寫入硬碟,加入內存緩存。如果沒有啟用,那麼就直接從網路壓縮獲取,加入內存即可。

附上出處鏈接:http://blog.csdn.net/lmj623565791/article/details/41874561

⑷ okhttp,retrofit,android-async-http,volley應該選擇哪一個

個人認為okhttp是android平台最好的網路庫。

volley是一個簡單的非同步http庫,僅此而已。缺點是不支持同步,這點會限制開發模式;不能post大數據,所以不適合用來上傳文件。

android-async-http,與volley一樣是非同步網路庫。但volley是封裝的httpUrlConnection,它是封裝的httpClient,而android平台不推薦用HttpClient了,所以這個庫已經不適合android平台了。

okhttp是高性能的http庫,支持同步、非同步,而且實現了spdy、http2、websocket協議,api很簡潔易用,和volley一樣實現了http協議的緩存。picasso就是利用okhttp的緩存機制實現其文件緩存,實現的很優雅,很正確,反例就是UIL(universal image loader),自己做的文件緩存,而且不遵守http緩存機制。

retrofit與picasso一樣都是在okhttp基礎之上做的封裝,項目中可以直接用了。

⑸ 如何高效的使用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實例你可以確保所有的請求超時是一致的

⑹ Android Picasso 的緩存怎麼清理

一、本地數據緩存分應用內、外緩存:

1、應用內部緩存,緩存被存儲在應用內部,具體位置:/data/data/應用包名/

a、清除緩存(/data/data/com.xxx.xxx/cache)

b、清除所有資料庫緩存(/data/data/com.xxx.xxx/database)

c、清除SharedPreference(/data/data/com.xxx.xxx/shared_prefs)

d、清除文件(/data/data/com.xxx.xxx/files)

2、應用外部緩存(/mnt/sdcard/android/data/com.xxx.xxx/cache)

3、自定義路徑文件,被存儲在設備的SD-CARD上,不同的設備和Android系統版本路徑不一樣,獲取路徑可以通過以下代碼:

1)、獲取內置SD卡路徑

⑺ glide和picasso哪個好

glide和Picasso都是圖片載入和緩存的開源庫。
雖然在函數定義和調用上和Picasso相差無幾,但是Glide確實在性能方面比Picasso要好,值得注意的是Glide庫僅支持Android 2.3.3及以上的版本.(PS:目前市面上貌似也很少看到Android 4.1以下的機型了,所以版本向下兼容可以不用擔心.)

⑻ 如何高效的使用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。

⑼ android okhttp超時怎麼辦

OkHttp是一個在開發可汗學院AndroidAPP過程中非常重要的依賴庫。它的默認的配置為我們提供了非常重要實用功能,下面一些步驟我們可以讓Okhttp提供功能使用靈活和內省能力。1.啟用文件系統上的響應緩存默認情況下,Okhttp不支持響應緩存,包括HTTPCache-Control頭允許緩存響應。因此,客戶端通過一次又一次的請求相同的資源浪費時間和帶寬。而不是簡單地讀取初始響應後緩存的副本。要在文件系統中啟用響應緩存,需要配置com.squareup.okhttp.Cache實例,並把它傳遞給你的OkHttpClient實例的setCache方法。你必須初始化緩存與存放目錄的文件,並以位元組為單位的最大值。響應返回數據可以寫入給定目錄文件,如果一個響應的緩存超過了給定的大小。我們可以採取LRUpolicy。我們可以在stackoverflow查看JesseWilson的回復。我們可以通過context.getCacheDir()在子目錄中緩存我們的響應://Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}//Basedirectoryrecommendedby/q/4441849/400717.final@NullableFilebaseDir=context.getCacheDir();if(baseDir!=null){finalFilecacheDir=newFile(baseDir,"HttpResponseCache");okHttpClient.setCache(newCache(cacheDir,HTTP_RESPONSE_DISK_CACHE_MAX_SIZE));}在可汗學院的程序中我們指定HTTP_RESPONSE_DISK_CACHE_MAX_SIZEas10*1024*1024,or10MB的大小2.集成StethoStetho是Facebook的一個可愛的庫,可以使用Chrome瀏覽器的Chrome開發人員工具功能來檢查你的Android應用程序。Stetho除了允許你檢查你的應用程序的SQLite資料庫,還可以查看View的層次結構。允許你檢查由OkHttp發起的每個請求和響應:這種自省機制是確保伺服器返回允許資源緩存的HTTP頭是非常有用的,以及驗證沒有請求時,保證緩存的資源存在。要想使用Stetho,只需添加一個StethoInterceptor實例的網路攔截器列表:okHttpClient.networkInterceptors().add(newStethoInterceptor());okHttpClient.networkInterceptors().add(newStethoInterceptor());然後,運行應用程序,打開瀏覽器後,輸入chrome://inspect。然後你就會看到應用程序的設備和標識符的列表。然後滑鼠右鍵選擇inspect打開開發者工具,然後打開新的tab,開始監控OkHttp請求。3.使用Picasso和Retrofit你可能使用過Picasso來載入網路圖片,或者使用Retrofit來簡化發出請求和解碼響應。這些第三方庫將隱式地創建自己的OkHttpClient供內部使用,如果你不明確指定一個。Picassoversion2.5.2的OkHttpDownloader類:(){OkHttpClientclient=newOkHttpClient();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);returnclient;}(){OkHttpClientclient=newOkHttpClient();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);returnclient;}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方法。finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);finalPicassopicasso=newPicasso.Builder(context).downloader(newOkHttpDownloader(okHttpClient)).build();//,butreplacethesingleton//instancejustincase.Picasso.setSingletonInstance(picasso);在Retrofit中要使用OkHttpClient實例,需要改造1.9.x的一個RestAdapter,需要將OkHttpClient封裝OkClient的實例中。然後把它傳遞給RestAdapter.Builder實例的setClient方法。restAdapterBuilder.setClient(newOkClient(httpClient));restAdapterBuilder.setClient(newOkClient(httpClient));在Retrofit2.0中只需要簡單的將OkHttpClient傳遞給Retrofit.Builder實例的client方法。在可汗學院的APP中我們通過Dagger依賴注入來確保我們只有一個OkHttpClient的實例。這種方法同樣也適用於Picasso和Retrofit我們提供了一個為OkHttpClient實例提供單例模式的註解示例:@Provides@(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}@Provides@(finalContextcontext,){finalOkHttpClientokHttpClient=newOkHttpClient();configureClient(okHttpClient,);returnokHttpClient;}OkHttpClient將會通過Dagger的註解創建一個實例提供給我們的Picasso和Retrofit。4.指定一個用戶代理攔截器日誌文件和分析為我們提供了有用的信息,當客戶在每個請求提供詳細的User-Agentheader值的時候。默認情況下,Okhttp包含User-Agent值只有在特定的Okhttp版本中。為了指定我們自己的useragent。首先創建攔截器的替換值,我們可以看stackoverflow的建議。{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}{privatestaticfinalStringUSER_AGENT_HEADER_NAME="User-Agent";;publicUserAgentInterceptor(StringuserAgentHeaderValue){this.userAgentHeaderValue=Preconditions.checkNotNull(userAgentHeaderValue);}@(Chainchain)throwsIOException{finalRequestoriginalRequest=chain.request();=originalRequest.newBuilder().removeHeader(USER_AGENT_HEADER_NAME).addHeader(USER_AGENT_HEADER_NAME,userAgentHeaderValue).build();returnchain.proceed(requestWithUserAgent);}}為了創建User-Agentheader值人然後傳遞給UserAgentInterceptor的構造器,使用你得到的任何信息。我們可以使用:android的系統信息可以清晰的傳遞出這是一台android設備Build.MODEL或者「製造商提供的用戶可見最終可見的名稱」Build.BRAND或者「消費者可見的品牌與產品/硬體相關信息」Build.VERSION.SDK_INT或者「消費者可見的Android提供的SDK版本號」BuildConfig.APPLICATION_IDBuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE最後三個值由的applicationID,VERSIONCODE和VERSIONNAME的值在我們的Gradlebuild腳本中了解信息可以查看versioningyourapplications和請注意,如果您的應用程序使用的是WebView,您可以配置使用相同的User-Agentheader值,你可以通過下面方法創建UserAgentInterceptor:WebSettingssettings=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實例你可以確保所有的請求超時是一致的

⑽ picasso 支持https嗎

1.載入載網路或本地圖片並自動緩存處理; 2.鏈式調用; 3.圖形轉換操作,如變換大小,旋轉等,提供了介面來讓用戶可以自定義轉換操作; 4.在Adapter中回收和取消當前的下載功能; 與Universal-ImageLoader庫對比: 1.都有高效的網路圖片下載和緩存性能; 2.Universal-ImageLoader功能多,靈活使用配置; 3.Picasso使用復雜的圖片壓縮轉換來盡可能的減少內存消耗; 4.在Adapter中需要取消已經不在視野范圍的ImageView圖片資源的載入,否則會導致圖片錯位,Picasso已經解決了這個問題; 用法: 1.圖片轉換:轉換圖片以適應布局大小並減少內存佔用 Picasso.with(context).load(url).resize(50, 50) .centerCrop() .into(imageView); 2.Adapter 中的下載:Adapter的重用會被自動檢測到,Picasso會取消上次的載入; 3.空白或者錯誤占點陣圖片設置方法及本地資源文件的載入方法; 4.Picasso採用鏈式調用載入和處理圖片方式; 5.除了載入網路圖片,picasso還支持載入Resources, assets, files, content providers中的本地資源文件;

熱點內容
微軟安卓編譯軟體 發布:2024-10-28 12:16:05 瀏覽:564
蘋果軟體如何關閉存儲 發布:2024-10-28 12:08:57 瀏覽:625
ie設置代理伺服器地址 發布:2024-10-28 11:52:37 瀏覽:657
如何製作一個好的伺服器 發布:2024-10-28 11:45:07 瀏覽:401
python核心編程第2版 發布:2024-10-28 11:40:34 瀏覽:504
雲伺服器如何搭建手游服務端 發布:2024-10-28 11:39:36 瀏覽:834
python讀取漢字 發布:2024-10-28 11:32:32 瀏覽:558
文件夾運行cmd 發布:2024-10-28 11:22:34 瀏覽:206
我的世界空島伺服器地址 發布:2024-10-28 11:22:17 瀏覽:550
備課系統源碼 發布:2024-10-28 11:15:23 瀏覽:191