当前位置:网站首页>Glide conclusion

Glide conclusion

2022-07-05 10:16:00 asahi_ xin

Custom module

In most cases , Only one line of code is needed to load the image . When we need to change the default configuration , You need to customize the module .

First define your own module class .

public class MyGlideModule implements GlideModule {
    
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
    

    }

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

    }
}

stay AndroidManifest.xml Add the following configuration to the file .

<application ...>
        <meta-data
            android:name="test.nxx.myapplication.MyGlideModule"
            android:value="GlideModule" />
            
    </application>

If you want to change Glide Default configuration , In fact, it only needs to be in applyOptions() Method in advance of the method Glide It is OK to initialize the configuration item of .

  • setMemoryCache()
    Used for configuration Glide Memory cache strategy of , The default configuration is LruResourceCache.
  • setBitmapPool()
    Used for configuration Glide Of Bitmap Buffer pool , The default configuration is LruBitmapPool.
  • setDiskCache()
    Used for configuration Glide Hard disk cache strategy of , The default configuration is InternalCacheDiskCacheFactory.
  • setDiskCacheService()
    Used for configuration Glide An asynchronous actuator that reads images from the cache , The default configuration is FifoPriorityThreadPoolExecutor, That's the first in, first out principle .
  • setResizeService()
    Used for configuration Glide Asynchronous executor that reads non cached images , The default configuration is also FifoPriorityThreadPoolExecutor.
  • setDecodeFormat()
    Used for configuration Glide The decoding mode of loading picture , The default configuration is RGB_565.

Example

public class MyGlideModule implements GlideModule {
    

    public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
    
        // Cache pictures to SD card 
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));
        // Picture format changed to ARGB_8888
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

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

    }
}

Replace Glide Components

Gilde The network request used is HttpURLConnection, If you want to cache okHttp It needs to be replaced Glide Components .

public class OkHttpStreamFetcher implements DataFetcher<InputStream> {
    
    private final Call.Factory client;
    private final GlideUrl url;
    private InputStream stream;
    private ResponseBody responseBody;
    private volatile Call call;

    public OkHttpStreamFetcher(Call.Factory 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;
        call = client.newCall(request);
        response = call.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() {
    
        try {
    
            if (stream != null) {
    
                stream.close();
            }
        } catch (IOException e) {
    
            // Ignored
        }
        if (responseBody != null) {
    
            responseBody.close();
        }
    }

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

    @Override
    public void cancel() {
    
        Call local = call;
        if (local != null) {
    
            local.cancel();
        }
    }
}
public class OkHttpUrlLoader implements StreamModelLoader<GlideUrl> {
    

    private final Call.Factory client;

    public OkHttpUrlLoader(Call.Factory client) {
    
        this.client = client;
    }

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

    public static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> {
    
        private static volatile Call.Factory internalClient;
        private Call.Factory client;

        public Factory() {
    
            this(getInternalClient());
        }

        public Factory(Call.Factory client) {
    
            this.client = client;
        }

        private static Call.Factory getInternalClient() {
    
            if (internalClient == null) {
    
                synchronized (Factory.class) {
    
                    if (internalClient == null) {
    
                        internalClient = new OkHttpClient();
                    }
                }
            }
            return internalClient;
        }

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

        @Override
        public void teardown() {
    
        }
    }
}

stay MyGlideModule call

public class MyGlideModule 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());
    }
}

That's it .

Of course Glide The government has provided us with very simple HTTP Component replacement method .

 implementation 'com.github.bumptech.glide:okhttp3-integration:1.5.0'
原网站

版权声明
本文为[asahi_ xin]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140534181828.html