項目一
項目中網絡請求偶有出現:
日志一
D/libc-netbsd: [getaddrinfo]: hostname=api1.51zhenghao.cn; servname=(null);
app_uid=10332; ai_addrlen=0; ai_canonname=(null); ai_flags=1024;
ai_family=0 from prox result 0
日志二
W/System.err: java.net.UnknownHostException:
Unable to resolve host "api.51zhenghao.cn": No address associated with hostname
網絡框架使用的是
// 聯網請求框架okgo
compile 'com.lzy.net:okgo:3.0.3'
日志二問題解決辦法方案
一:Unable to resolve host "api.51zhenghao.cn": No address associated with hostname
搜索解決方案:如果將配置文件中的 android:required 設置為true 執行以上代碼的時候會報錯 ,目前原因未知
查看配置文件AndroidManifest.xml,定位到如下代碼,我也不清楚添加這個什么意義(不是我寫的)。
<uses-feature
android:glEsVersion="0x00020000"
android:required="false(true)" />
修改之后,基本沒有出現DNS解析不了的問題了。
二:
項目二
網絡請求框架Retrofit2.1.0
引入框架
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
有網無網絡先讀緩存中的數據
//retrofit(非異步)網絡請求框架,與RxJava(異步框架)結合使用
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(getOkHttpClient())
.addConverterFactory(customGsonConverterFactory)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())// 把 Retrofit 轉成 RxJava 可用的適配類。
.build();
private OkHttpClient getOkHttpClient() {
Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);//緩存文件為50MB
httpClientBuilder.cache(cache);
httpClientBuilder.addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
request = request.newBuilder()
.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
.addHeader("Accept-Language", "zh-CN,zh;q=0.8")
.addHeader("Connection", "keep-alive")
.addHeader("Host", "api.51zhenghao.cn")
.build();
Response response = chain.proceed(request);
response = response.newBuilder()
.header("Cache-Control", "public, max-age=" + maxAge)//單位(秒)
.removeHeader("Pragma") //清除頭信息,因為服務器如果不支持,會返回一些干擾信息
.build();
return response;
}
});
okHttpClient = httpClientBuilder.build();
return okHttpClient;
}
有網絡從網絡獲取數據,無網絡從緩存中讀取數據
private OkHttpClient getOkHttpClient() {
Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);//緩存文件為50MB
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.cache(cache);
//設置網絡請求緩存策略
httpClientBuilder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (NetUtil.isConnected(BaseApplication.getContext())) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_NETWORK)//有網絡時只從網絡獲取
.build();
} else {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)//無網絡時只從緩存中讀取
.build();
}
Response response = chain.proceed(request);
if (NetUtil.isConnected(BaseApplication.getContext())) {
response = response.newBuilder()
.build();
} else {
response = response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")//清楚響應體對Cache有影響的信息
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)//單位(秒)
.build();
}
return response;
}
});
okHttpClient = httpClientBuilder.build();
return okHttpClient;
}
拋出異常retrofit2.adapter.rxjava.HttpException:HTTP 504 Unsatisfiable Request (only-if-cached)