踩坑记

2018-09-21  本文已影响0人  _Rice_

1、android自签名证书Glide加载不出图片

关于https中自签名证书的介绍以及OkHttp中解决自签名证书问题,可以参考鸿洋的这篇博客http://blog.csdn.net/lmj623565791/article/details/48129405 本文主要介绍okhttp,glide,webview中无法访问使用自签名证书服务器的问题。
OkHttp

Glide

在使用Glide时如果遇到自签名证书的请求会出现图片无法加载的问题。好在Glide允许自定义使用OkHttp进行图片下载。需要添加如下三个类,在第三个类中使用到的HttpUtils即为我在第一篇文章中提到的类:


public class OkHttpGlideModule implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // Do nothing.
     }
    @Override
    public void registerComponents(Context context, Glide glide) {
         glide.register(GlideUrl.class, InputStream.class, new      OkHttpUrlLoader.Factory());
    }
}


public class OkHttpStreamFetcher implements DataFetcher<InputStream> {
private final OkHttpClient client;
private final GlideUrl url;
private InputStream stream;
private ResponseBody responseBody;
public OkHttpStreamFetcher(OkHttpClient client, GlideUrl url) {
    this.client = client;
    this.url = url;
}
@Override
public InputStream loadData(Priority priority) throws Exception {
    Request.Builder requestBuilder = new Request.Builder()
            .url(url.toStringUrl());

    for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) {
        String key = headerEntry.getKey();
        requestBuilder.addHeader(key, headerEntry.getValue());
    }

    Request request = requestBuilder.build();

    Response response = client.newCall(request).execute();
    responseBody = response.body();
    if (!response.isSuccessful()) {
        throw new IOException("Request failed with code: " + response.code());
    }

    long contentLength = responseBody.contentLength();
    stream = ContentLengthInputStream.obtain(responseBody.byteStream(), contentLength);
    return stream;
}

@Override
public void cleanup() {
    if (stream != null) {
        try {
            stream.close();
        } catch (IOException e) {
            // Ignored
        }
    }
    if (responseBody != null) {
        try {
            responseBody.close();
        } catch (IOException e) {
            // Ignored.
        }
    }
}

@Override
public String getId() {
    return url.getCacheKey();
}

@Override
public void cancel() {
    // TODO: call cancel on the client when this method is called on a background thread. See #257
}


public class OkHttpUrlLoader implements ModelLoader<GlideUrl, InputStream> {
/**
 * The default factory for {@link OkHttpUrlLoader}s.
 */
public static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> {
    private static volatile OkHttpClient internalClient;
    private OkHttpClient client;

    private static OkHttpClient getInternalClient() {
        if (internalClient == null) {
            synchronized (OkHttpUrlLoader.Factory.class) {
                if (internalClient == null) {
                    internalClient = new OkHttpClient();
                    internalClient.setSslSocketFactory(HttpUtils.createSSLSocketFactory());
                    internalClient.setHostnameVerifier(new HttpUtils.TrustAllHostnameVerifier());
                }
            }
        }
        return internalClient;
    }

    /**
     * Constructor for a new Factory that runs requests using a static singleton client.
     */
    public Factory() {
        this(getInternalClient());
    }

    /**
     * Constructor for a new Factory that runs requests using given client.
     */
    public Factory(OkHttpClient client) {
        this.client = client;
    }

    @Override
    public ModelLoader<GlideUrl, InputStream> build(Context context, GenericLoaderFactory factories) {
        return new OkHttpUrlLoader(client);
    }

    @Override
    public void teardown() {
        // Do nothing, this instance doesn't own the client.
    }
}

    private final OkHttpClient client;

    public OkHttpUrlLoader(OkHttpClient client) {
       this.client = client;
     }

    @Override
    public DataFetcher<InputStream> getResourceFetcher(GlideUrl model, int width,           int height) {
        return new OkHttpStreamFetcher(client, model);
    }
}

最后需要在AndroidManifest.xml Application下添加如下内容
<meta-data android:name="com.hand.hrms.utils.okhttpforglide.OkHttpGlideModule" android:value="GlideModule" />

2、NestedScrollView+RecyclerView优雅的解决滑动冲突问题

ScrollView嵌套RecyclerView也会存在显示不全的问题,滑动也有一点点粘连的感觉不是太流畅,NestedScrollView嵌套RecyclerView不会存在显示不全的问题

3、无法翻墙导致jar下载失败,build不过

解决方案:Android Studio阿里镜像配置

上一篇 下一篇

猜你喜欢

热点阅读