2014-02-05 4 views
9

나는 우리의 어플리케이션 중 하나에서 retrofitokhttp을 사용합니다.Android에서 httpCaching을 기본값으로 사용하는 Retrofit + Okhttp입니까?

Retrofit의 기본 동작에 대한 좋은 설명을 찾을 수 없습니다.

Okhttp이 클래스 경로에 있으면 자동으로 사용됩니다. 그러나 내가 볼 수있는 한 기본 HttpResponseCache는 null입니다.

Retrofit 및 Okhttp를 사용하여 명시 적으로 캐싱을 활성화해야합니까?

답변

7

OkHttpClient를 수동으로 만들어 원하는 방식으로 구성해야합니다. 이 경우 캐시를 설치해야합니다. 일단 당신은 OkClient을 만들고 그것을 Retrofit 's에 전달하십시오. RestAdapter.Builder

또한 HTTP POST 요청에 대한 캐싱도 없습니다. 그러나 GET은 캐시됩니다.

+1

documentation은 내가 별도의 대답에 사용 된 코드를 추가하십시오. 당신의 예제에서 복사 한 이후 코드가 괜찮 으면 좋겠다. – Janusz

+1

http://stackoverflow.com/questions/22445177/trying-to-make-use-of-httpcache-android는 캐시를 더 이상 구성 할 필요가 없다고 말합니다. 이 올바른지? – Janusz

8

OkHttpClient V2.0.0에서 더 이상 사용되지 제시 윌슨이 지적 당신이 당신의 자신의 캐시를 만들 필요가

높은.
다음 코드는 10MB 캐시를 만들어야합니다.

File httpCacheDirectory = new File(application.getApplicationContext() 
    .getCacheDir().getAbsolutePath(), "HttpCache"); 

HttpResponseCache httpResponseCache = null; 
try { 
    httpResponseCache = new HttpResponseCache(httpCacheDirectory, 10 * 1024); 
} catch (IOException e) { 
    Log.e(getClass().getSimpleName(), "Could not create http cache", e); 
} 

OkHttpClient okHttpClient = new OkHttpClient(); 
okHttpClient.setResponseCache(httpResponseCache); 
builder.setClient(new OkClient(okHttpClient)); 

코드는 Jesse Wilsons example on Github을 기반으로합니다. OkHttpClient v2의

+0

이것이 게시물에 설정되어 있다면 무시 되나요? 모든 요청에 ​​사용되는 일반 빌더에서 설정하기 때문에 – Lion789

+0

http://stackoverflow.com/questions/22445177/trying-to-make-use-of-httpcache-android이 오류가 실제로 발생합니다 ... httpResponseCache.install을 사용하지 않으면 새로운 HttpResponseCache가 외부에서 사용할 수 없다는 오류가 발생합니다 ... 공개가 아닙니다 .. – Lion789

+2

은 10MB 캐시가 아닙니까? –

15

올바른 구현 :

int cacheSize = 10 * 1024 * 1024; // 10 MiB 
File cacheDir = new File(context.getCacheDir(), "HttpCache"); 
Cache cache = new Cache(cacheDir, cacheSize); 
OkHttpClient client = new OkHttpClient.Builder() 
    .cache(cache) 
    .build(); 

내가이뿐만 아니라 다른 사람들을위한 재미있을 것이라고 생각하기 때문에

+3

setCache가 3에 존재하지 않습니다. 그래서 새로운 OkHttpClient.Builder(). cache (cache) .build();를 사용할 수있다. – frostymarvelous

+0

Thanks @ frostymarvelous –