没想到因为想要记录问题注册
也没想到的第一篇就是记录问题…………
最近新起一个项目,第一次封装网络请求……硬着头皮写
public class OkhttpProvider {
private static OkhttpProviderprovider;
private OkHttpClientclient;
private OkhttpProvider(){
OkHttpClient.Builder builder =new OkHttpClient.Builder()
.connectTimeout(ConstantUtils.CONNECT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(ConstantUtils.WRITE_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(ConstantUtils.READ_TIMEOUT, TimeUnit.SECONDS)
.addNetworkInterceptor(new CacheControlInterceptor())
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new HeaderInterceptor());
//设置缓存
File httpCacheDirectory =new File(
CustomApplication.getContext().getCacheDir(),"OkHttpCache");
builder.cache(new Cache(httpCacheDirectory,100 *1024 *1024));
client= builder.build();
}
public static OkhttpProvider getInstance(){
if (provider ==null){
provider =new OkhttpProvider();
}
return provider;
}
public OkHttpClient getClient() {
return client;
}
private static class CacheControlInterceptorimplements Interceptor{
@Override
public Response intercept(Chain chain)throws IOException {
Request request = chain.request();
if (!NetworkUtils.isConnected(CustomApplication.getContext())) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
Log.d("CacheControlInterceptor","no Network");
}
Response response = chain.proceed(request);
if (NetworkUtils.isConnected(CustomApplication.getContext())) {
int maxAge =60 *60;
String cacheControl = request.cacheControl().toString();
if (TextUtils.isEmpty(cacheControl)) {
cacheControl ="public, max-age=" + maxAge;
}
response = response.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", cacheControl)
.build();
}else {
int maxStale =60 *60 *24 *30;
response = response.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control","public, only-if-cached, max-stale=" + maxStale)
.build();
}
return response;
}
}
private static class HeaderInterceptorimplements Interceptor {
@Override
public Response intercept(Chain chain)throws IOException {
Request request = chain.request().newBuilder()
// .addHeader("","")
.build();
return chain.proceed(request);
}
}
private static class LoggingInterceptorimplements Interceptor {
@Override
public Response intercept(Chain chain)throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Log.i("okhttp", String.format(Locale.CHINA,"Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
ResponseBody responseBody = response.peekBody(1024 *1024);
long t2 = System.nanoTime();
Log.i("okhttp", String.format(Locale.CHINA,"Received response for %s [%s] in %.1fms%n%s",
response.request().url(), responseBody.string(), (t2 - t1) /1e6d, response.headers()));
return response;
}
}
}
测试发现不管有没有网,取得都是缓存数据……
后来发现拦截器有问题,改成了这样
private OkhttpProvider(CacheControlInterceptor cacheInterceptor){
OkHttpClient.Builder builder =new OkHttpClient.Builder()
.connectTimeout(ConstantUtils.CONNECT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(ConstantUtils.WRITE_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(ConstantUtils.READ_TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(cacheInterceptor)
.addNetworkInterceptor(cacheInterceptor)
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new HeaderInterceptor());
//设置缓存
File httpCacheDirectory =new File(
CustomApplication.getContext().getCacheDir(),"OkHttpCache");
builder.cache(new Cache(httpCacheDirectory,100 *1024 *1024));
client= builder.build();
}
public static OkhttpProvider getInstance(){
if (provider ==null){
provider =new OkhttpProvider(new CacheControlInterceptor());
}
return provider;
}
然后开始报错…………
08:56:49.878 32533-32533/com.neusoft.meda W/System.err: at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
05-07 08:56:49.879 32533-32533/com.neusoft.meda W/System.err: at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at com.neusoft.meda.rx.retrofit.OkhttpProvider$HeaderInterceptor.intercept(OkhttpProvider.java:97)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at com.neusoft.meda.rx.retrofit.OkhttpProvider$LoggingInterceptor.intercept(OkhttpProvider.java:110)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at com.neusoft.meda.rx.retrofit.OkhttpProvider$CacheControlInterceptor.intercept(OkhttpProvider.java:66)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
在网上差了一圈都没有结果,然后发现了一篇文章,虽然跟我的问题不一样,但是给了我提示啊!!!
我!没导入logging-interceptor包!!!
记录自己白痴的第一次网络封装……//哭