您的位置:首页 > 其它

Glide modules

2016-06-23 14:04 399 查看
1,实现方式
public class SimpleGlideModule implements GlideModule {  

    @Override public void applyOptions(Context context, GlideBuilder builder) {

        // todo

    }

    @Override public void registerComponents(Context context, Glide glide) {

        // todo

    }
}

<manifest

    ...

    <application>

        <meta-data

            android:name="io.futurestud.tutorials.glide.glidemodule.SimpleGlideModule"

            android:value="GlideModule" />

        ...

    </application>
</manifest>  

2,GlideBuilder
.setMemoryCache(MemoryCache memoryCache)
.setBitmapPool(BitmapPool bitmapPool)
.setDiskCache(DiskCache.Factory diskCacheFactory)
.setDiskCacheService(ExecutorService service)
.setResizeService(ExecutorService service)
.setDecodeFormat(DecodeFormat decodeFormat)

3,改变图片质量
public class SimpleGlideModule implements GlideModule {  

    @Override public void applyOptions(Context context, GlideBuilder builder) {

        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

    }

    @Override public void registerComponents(Context context, Glide glide) {

        // nothing to do here

    }
}

4,改变行为------以Unsafe OkHttpClient为例
registerComponents(),设置一个不同的网络堆栈。默认情况下,滑翔在内部使用HTTPUrlConnection下载图片的标准。
1》创建网络管理的单例
public class UnsafeOkHttpClient {  

    public static OkHttpClient getUnsafeOkHttpClient() {

        try {

            // Create a trust manager that does not validate certificate chains

            final TrustManager[] trustAllCerts = new TrustManager[]{

                    new X509TrustManager() {

                        @Override

                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {

                        }

                        @Override

                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {

                        }

                        @Override

                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {

                            return null;

                        }

                    }

            };

            // Install the all-trusting trust manager

            final SSLContext sslContext = SSLContext.getInstance("SSL");

            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager

            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient okHttpClient = new OkHttpClient();

            okHttpClient.setSslSocketFactory(sslSocketFactory);

            okHttpClient.setProtocols(Arrays.asList(Protocol.HTTP_1_1));

            okHttpClient.setHostnameVerifier(new HostnameVerifier() {

                @Override

                public boolean verify(String hostname, SSLSession session) {

                    return true;

                }

            });

            return okHttpClient;

        } catch (Exception e) {

            throw new RuntimeException(e);

        }

    }
}
2》网络下载图片
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

    }
}
3》实现Glide的ModelLoader接口
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 (Factory.class) {

                    if (internalClient == null) {

                        internalClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();

                    }

                }

            }

            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);

    }
}
4》改变Glide的网络加载行为
public class UnsafeOkHttpGlideModule implements GlideModule {  

        @Override

        public void applyOptions(Context context, GlideBuilder builder) {

        }

        @Override

        public void registerComponents(Context context, Glide glide) {

            glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());

        }

    }

5,自定义缓存---参考缓存

6,自定义的图像分辨率 https://futurestud.io/blog/glide-module-example-optimizing-by-loading-images-in-custom-sizes
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  glide 手机 Glide modules