当前位置:网站首页>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'
边栏推荐
- C function returns multiple value methods
- 《剑来》语句摘录(七)
- NCP1342芯片替代料PN8213 65W氮化镓充电器方案
- Single chip microcomputer principle and Interface Technology (esp8266/esp32) machine human draft
- 《微信小程序-基础篇》小程序中的事件与冒泡
- QT timer realizes dynamic display of pictures
- Kotlin compose multiple item scrolling
- Hard core, have you ever seen robots play "escape from the secret room"? (code attached)
- 程序员如何活成自己喜欢的模样?
- isEmpty 和 isBlank 的用法区别
猜你喜欢
高级 OpenCV:BGR 像素强度图
Swift set pickerview to white on black background
如何獲取GC(垃圾回收器)的STW(暫停)時間?
The king of pirated Dall · e? 50000 images per day, crowded hugging face server, and openai ordered to change its name
QT event filter simple case
[tips] get the x-axis and y-axis values of cdfplot function in MATLAB
双容水箱液位模糊PID控制系统设计与仿真(Matlab/Simulink)
[NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
学习笔记4--高精度地图关键技术(下)
How to plan the career of a programmer?
随机推荐
ConstraintLayout的流式布局Flow
硬核,你见过机器人玩“密室逃脱”吗?(附代码)
天龙八部TLBB系列 - 关于技能冷却和攻击范围数量的问题
苹果 5G 芯片研发失败?想要摆脱高通为时过早
Livedata interview question bank and answers -- 7 consecutive questions in livedata interview~
Constrained layout flow
Swift tableview style (I) system basic
Zblogphp breadcrumb navigation code
[论文阅读] CKAN: Collaborative Knowledge-aware Atentive Network for Recommender Systems
MySQL digital type learning notes
[C language] the use of dynamic memory development "malloc"
How to write high-quality code?
Flutter development: a way to solve the problem of blank space on the top of listview
一个程序员的职业生涯到底该怎么规划?
Single chip microcomputer principle and Interface Technology (esp8266/esp32) machine human draft
一种用于干式脑电图的高密度256通道电极帽
@SerializedName注解使用
Dedecms website building tutorial
@JsonAdapter注解使用
Using directive in angualr2 to realize that the picture size changes with the window size