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 ...
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 awidth, 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ẻ !