在ipv6環境下可能會出現網絡無法加載的情況,我們可以考慮使用ipv4優先的方案設置dns以加快網絡加載速度。
1. 設置okhttp優先使用ipv4
/**
* wifi環境下優先使用ipv4
*/
public class MyDns implements Dns {
@Override
public List<InetAddress> lookup(String hostname) throws UnknownHostException{
if (hostname == null){
throw new UnknownHostException ("hostname == null") ;
}else{
try{
List<InetAddress> inetAddressList = new ArrayList<>();
InetAddress[] inetAddresses = InetAddress.getAllByName (hostname) ;
for (InetAddress inetAddress: inetAddresses){
if (inetAddress instanceof Inet4Address){
inetAddressList.add(0, inetAddress) ;
}else{
inetAddressList.add(inetAddress);
}
}
return inetAddressList;
}catch (NullPointerException var4){
UnknownHostException unknownHostException = new UnknownHostException("Broken system behavior");
unknownHostException.initCause(var4);
throw unknownHostException;
}
}
}
}
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.dns(new MyDns());
OkHttpClient client = builder.build();
2. 設置圖片框架Glide優先ipv4
- 引入
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
implementation "com.github.bumptech.glide:okhttp3-integration:4.11.0"
- 自定義類繼承AppGlideModule,添加類注解@GlideModule
@GlideModule
public class OkHttpGlideModule extends AppGlideModule {
@Override
public boolean isManifestParsingEnabled() {
return false;
}
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
super.registerComponents(context, glide, registry);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.dns(new MyDns());
builder.followRedirects(true);
// 設置連接超時
builder.connectTimeout(10, TimeUnit.SECONDS);
// 設置socket超時
builder.readTimeout(60, TimeUnit.SECONDS);
builder.writeTimeout(60, TimeUnit.SECONDS);
OkHttpClient okHttpClient = builder.build();
registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));
}
}
- 在AndroidManifest.xml中<application>中添加<meta-data>項,如:
<meta-data
android:name="com.xxx.xxx.OkHttpGlideModule"
android:value="AppGlideModule"/>
- 混淆
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$**{
**[] $VALUES;
public *;
}
-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl {*;}