当前位置:网站首页>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'
边栏推荐
- Design and Simulation of fuzzy PID control system for liquid level of double tank (matlab/simulink)
- Six simple cases of QT
- 高级 OpenCV:BGR 像素强度图
- 如何获取GC(垃圾回收器)的STW(暂停)时间?
- Zblogphp breadcrumb navigation code
- Livedata interview question bank and answers -- 7 consecutive questions in livedata interview~
- Advanced opencv:bgr pixel intensity map
- 把欧拉的创新带向世界 SUSE 要做那个引路人
- The comparison of every() and some() in JS uses a power storage plan
- > Could not create task ‘:app:MyTest.main()‘. > SourceSet with name ‘main‘ not found.问题修复
猜你喜欢
![[论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems](/img/6c/5b14f47503033bc2c85a259a968d94.png)
[论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems

Node red series (29): use slider and chart nodes to realize double broken line time series diagram

How do programmers live as they like?

Swift set pickerview to white on black background

如何獲取GC(垃圾回收器)的STW(暫停)時間?

基于单片机步进电机控制器设计(正转反转指示灯挡位)

Comment obtenir le temps STW du GC (collecteur d'ordures)?

钉钉、企微、飞书学会赚钱了吗?

B站大量虚拟主播被集体强制退款:收入蒸发,还倒欠B站;乔布斯被追授美国总统自由勋章;Grafana 9 发布|极客头条...

isEmpty 和 isBlank 的用法区别
随机推荐
[tips] get the x-axis and y-axis values of cdfplot function in MATLAB
To bring Euler's innovation to the world, SUSE should be the guide
Comment obtenir le temps STW du GC (collecteur d'ordures)?
IDEA新建sprintboot项目
A high density 256 channel electrode cap for dry EEG
QT timer realizes dynamic display of pictures
苹果 5G 芯片研发失败?想要摆脱高通为时过早
pytorch输出tensor张量时有省略号的解决方案(将tensor完整输出)
[NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
【系统设计】指标监控和告警系统
La vue latérale du cycle affiche cinq demi - écrans en dessous de cinq distributions moyennes
Tianlong Babu TLBB series - questions about skill cooling and the number of attack ranges
How to plan the career of a programmer?
QT realizes signal transmission and reception between two windows
Tianlong Babu TLBB series - about items dropped from packages
The most complete is an I2C summary
The essence of persuasion is to remove obstacles
QT event filter simple case
How to judge that the thread pool has completed all tasks?
TypeError: Cannot read properties of undefined (reading ‘cancelToken‘)