+1

Custom ModelLoader in Glide with custom OkHttpUrlLoader

Chào mọi người, hiện nay việc sử dụng Glide khá phổ biến, một phần là do google recommend sử dụng, 1 phần vì nhiều người dùng và cũng cảm thấy nó tốt và có nhiều tính năng.

Mặc định , Glide sẽ sử dụng HttpUrlConnection để thực hiện các kết nối mạng, tuy nhiên nhiều khi chúng ta muốn dùng OkHttp hay Volley để thay thế thì hoàn toàn có thể được, và glide cũng chỉ hỗ trợ tích hợp OkHttp và Volley. Ở đây mình sẽ tạo một ModelLoader mới sử dụng Okhttp và custom 1 số thuộc tính cho OkHttpClient của nó

Đầu tiên để tích hợp OkHttp vào project cần khai báo thêm 2 dòng trong build.gradle

    compile 'com.github.bumptech.glide:okhttp-integration:1.3.1@aar'
    compile 'com.squareup.okhttp:okhttp:2.7.2'

Sau đó tạo 1 ModelLoader

public class CustomOkhttpModelLoaderFactory implements ModelLoader<GlideUrl, InputStream> {
    /**
     * The default factory for {@link CustomOkhttpModelLoaderFactory}s.// CustomOkHttp
     */
    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) {
                        OkHttpClient okHttpClient = new OkHttpClient();
                        okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
                        okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
                        okHttpClient.setWriteTimeout(60, TimeUnit.SECONDS);
                        internalClient = okHttpClient;
                    }
                }
            }
            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 CustomOkhttpModelLoaderFactory(client);
        }

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

    private final OkHttpClient client;

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

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

Thực tế là class này viết lại dựa trên cấu trúc của chính class OkHttpUrlLoader của Glide, nhưng viết lại để custom được OkHttpClient ở trong đó, ở đây mình ví dụ với việc set timeout bằng 60s.

Sau khi có model rồi thì cần tạo CustomGlideModule để sử dụng:

public class MyGlideModule implements GlideModule {

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

    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        glide.setMemoryCategory(MemoryCategory.HIGH);
        glide.register(GlideUrl.class, InputStream.class, new CustomOkhttpModelLoaderFactory.Factory());
    }
}

Bước cuối cùng là vào Manifest để khai báo, giúp glide biết sẽ sử dụng module vừa tạo. Add thêm vào trong tag <application></application> tag:

        <meta-data
            android:name="stereograms.ninhnk.com.Module.MyGlideModule"
            android:value="GlideModule" />

Như vậy là đã hoàn thành việc tích hợp và custom OkHttpClient để sử dụng trong Glide.

Chúc mọi người code vui vẻ ! 😄


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí