告别OOM和卡顿:Kotlin中Glide内存管理的黄金法则

第一章:告别OOM和卡顿:Kotlin中Glide内存管理的黄金法则

在Android开发中,图片加载是提升用户体验的关键环节,但不当的内存使用极易引发OutOfMemoryError(OOM)或界面卡顿。Glide作为主流图片加载库,其默认行为虽便捷,但在复杂场景下需精细化控制内存策略。掌握其内存管理机制,是保障应用稳定流畅的核心。

合理配置内存缓存策略

Glide默认启用内存与磁盘缓存,但在列表快速滑动时,频繁创建Bitmap可能导致内存紧张。可通过`skipMemoryCache()`和`diskCacheStrategy()`调整行为:
// 禁用内存缓存,仅使用磁盘缓存
Glide.with(context)
    .load(imageUrl)
    .skipMemoryCache(true) // 跳过内存缓存
    .diskCacheStrategy(DiskCacheStrategy.DATA) // 缓存原始数据
    .into(imageView)
此配置适用于临时性图片展示,减少内存占用。

自定义内存大小与缓存限制

通过实现`GlideModule`可定制内存缓存容量:
class CustomGlideModule : AppGlideModule() {
    override fun applyOptions(context: Context, builder: GlideBuilder) {
        val memoryCacheSizeBytes = 1024 * 1024 * 20 // 20MB
        builder.setMemoryCache(LruResourceCache(memoryCacheSizeBytes))
    }
}
该代码将最大内存缓存限制为20MB,避免过度占用系统资源。

监控与调试工具建议

Glide提供`RequestListener`用于监控加载过程,便于定位内存问题:
  • 监听图片加载失败与取消事件
  • 结合Profiler观察Bitmap分配情况
  • 使用`Glide.get(context).clearMemory()`在低内存时主动清理
策略适用场景内存影响
MEMORY_AND_DISK常用图片高(优先内存)
DISK_ONLY一次性大图低
ALL高频访问资源中高

第二章:深入理解Glide的内存缓存机制

2.1 Glide内存缓存架构解析:LruResourceCache与MemoryCache原理

Glide 的内存缓存采用双层结构,核心由 `LruResourceCache` 实现,基于最近最少使用(LRU)算法管理内存中图片资源的生命周期。
缓存容量控制
默认缓存大小为设备可用内存的 1/8,最大不超过 4MB。可通过自定义配置调整:

int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
MemoryCache memoryCache = new LruResourceCache(maxSize);
glideBuilder.setMemoryCache(memoryCache);
上述代码中,`maxSize` 定义缓存上限,`LruResourceCache` 在 put 操作时判断是否超出阈值,若超出则逐出最久未使用的条目。
数据同步机制
Glide 使用弱引用与强引用结合的方式维护活动资源(Active Resources),避免正在使用的资源被回收。当资源从 Active 状态释放后,自动转入 LRU 缓存队列。
  • 强引用:持有非活跃资源,参与 LRU 排序
  • 弱引用:指向正在被 View 使用的图片,防止内存浪费

2.2 缓存键生成策略:如何避免重复加载与内存浪费

合理的缓存键设计是提升缓存命中率、减少内存开销的关键。若键名过于简单或缺乏上下文,可能导致不同数据的冲突或重复存储。
唯一性与可读性平衡
缓存键应包含足够的上下文信息以确保唯一性,例如结合业务类型、用户ID和参数摘要:
// 生成带命名空间和哈希摘要的缓存键
func GenerateCacheKey(namespace string, userID int, params map[string]string) string {
    paramHash := sha256.Sum256([]byte(fmt.Sprintf("%v", params)))
    return fmt.Sprintf("%s:user_%d:%x", namespace, userID, paramHash[:8])
}
该函数通过命名空间隔离业务域,用户ID区分主体,参数哈希防止长键名,兼顾性能与唯一性。
避免冗余加载
使用统一键生成规则可防止相同数据因格式差异被多次加载。建议建立全局键模板:
  • 格式:{服务}:{实体}:{标识}:{参数摘要}
  • 示例:user:profile:1001:abc123xyz

2.3 内存缓存大小配置:基于设备性能动态调整的最佳实践

在高并发系统中,静态内存缓存配置易导致资源浪费或性能瓶颈。通过检测设备可用内存与CPU核心数,动态调整缓存容量可显著提升资源利用率。
运行时性能探测
应用启动时采集硬件信息,为缓存策略提供决策依据:
// 获取可用内存(单位:MB)
func getAvailableMemory() int {
    var memStats runtime.MemStats
    runtime.ReadMemStats(&memStats)
    return int(memStats.Sys / 1024 / 1024)
}

// 根据内存分配缓存大小
var cacheSize = map[int]int{
    1024:  64,   // ≤1GB → 64MB 缓存
    4096:  256,  // ≤4GB → 256MB
    8192:  512,  // ≤8GB → 512MB
    16384: 1024, // >8GB → 1GB
}
上述代码通过运行时统计获取系统内存占用,并根据预设阈值动态设定缓存上限,避免OOM。
自适应策略表
设备内存CPU核心数推荐缓存大小
≤2GB≤264MB
4–8GB4256MB
>8GB≥81GB

2.4 弱引用与活动资源管理:理解Active Resources的设计精髓

在现代系统设计中,资源的生命周期管理至关重要。Active Resources 通过弱引用机制实现高效的对象跟踪,避免内存泄漏的同时维持运行时状态感知。
弱引用的核心作用
弱引用允许程序访问对象而不阻止其被垃圾回收。这在缓存、观察者模式和资源池中尤为关键。
  • 不增加引用计数,避免长生命周期容器持有短生命周期对象
  • 结合引用队列(ReferenceQueue),可感知对象回收事件
Active Resources 的典型实现

class ActiveResourceManager {
    private final Map<Key, WeakReference<Resource>> activeResources = new ConcurrentHashMap<>();
    
    public Resource get(Key key) {
        WeakReference<Resource> ref = activeResources.get(key);
        Resource res = (ref != null) ? ref.get() : null;
        if (res == null) {
            res = new Resource(key);
            activeResources.put(key, new WeakReference<(res));
        }
        return res;
    }
}
上述代码中,WeakReference 包装 Resource 实例,确保当外部不再强引用时,GC 可正常回收。ConcurrentHashMap 保证线程安全的资源查找与注册,适用于高并发场景下的动态资源管理。

2.5 实战:监控内存使用并定制自定义MemoryCache

在高并发服务中,内存缓存是提升性能的关键组件。原生的 `MemoryCache` 虽然高效,但缺乏细粒度监控和动态调控能力。
内存监控与指标采集
通过集成 .NET 的 `IMemoryCache` 与 `IHostedService`,可定期采集当前内存使用情况:

public class MemoryMonitor : BackgroundService
{
    private readonly IMemoryCache _cache;
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var currentSize = _cache.Count(); // 模拟统计条目数
            Console.WriteLine($"Cached entries: {currentSize}");
            await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken);
        }
    }
}
该服务每10秒输出缓存项数量,便于观察缓存命中与淘汰行为。
自定义缓存策略
为实现更灵活的控制,可封装 `MemoryCache` 并添加过期回调与大小限制:
  • 设置最大条目数阈值
  • 启用LRU(最近最少使用)淘汰机制
  • 注册回调以追踪缓存失效事件

第三章:高效使用Glide进行图片加载优化

3.1 使用with、load、into流程中的内存控制技巧

在数据处理流程中,with、load、into 常用于构建临时作用域与数据加载链。合理使用这些关键字可有效控制内存占用。
分批加载减少峰值内存
通过指定批量大小,避免一次性加载过大数据集:
with db.connect() as conn:
    for batch in load(data_source, chunk_size=1000):
        into(conn, batch)  // 每批次处理后自动释放
chunk_size 控制每次读取记录数,降低GC压力。
资源自动回收机制
with 确保连接对象在作用域结束时被销毁,防止句柄泄漏。
  • 使用生成器实现惰性加载
  • 避免中间变量强引用大对象

3.2 图片尺寸与采样率优化:避免Bitmap过度分配内存

在Android应用开发中,加载高分辨率图片时若不进行尺寸适配,极易导致Bitmap占用过多内存,从而引发OOM异常。
合理缩放图片
通过设置inSampleSize参数对图片进行降采样,可显著减少内存占用。该值为2的幂次,表示每边像素缩减比例。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 2; // 缩小为原图1/2
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.image, options);
上述代码将图片宽高各缩小一半,内存占用降至原始的1/4。
匹配视图需求
加载前应预估目标控件尺寸,动态计算最优inSampleSize,避免加载远超显示需求的分辨率。
  • 使用inJustDecodeBounds获取原始尺寸
  • 根据目标控件宽高计算采样率
  • 复用Bitmap或采用Glide等库自动化管理

3.3 生命周期感知与请求管理:防止内存泄漏的关键实践

在现代应用开发中,异步请求若未与组件生命周期对齐,极易引发内存泄漏。通过引入生命周期感知机制,可确保请求在组件销毁时自动取消。
使用协程与ViewModel结合
lifecycleScope.launch {
    viewModel.userFlow.collect { user ->
        updateUI(user)
    }
}
上述代码利用 lifecycleScope 绑定协程生命周期,当宿主(如Activity)销毁时,协程自动取消,避免持有已销毁组件的引用。
请求取消策略对比
策略手动管理生命周期感知
内存泄漏风险高低
代码复杂度高低

第四章:进阶内存管理策略与问题排查

4.1 使用GlideModule进行全局配置优化内存行为

通过实现 GlideModule 接口,开发者可在应用启动时对 Glide 进行全局配置,从而精细控制内存缓存策略与磁盘行为。
自定义内存与磁盘缓存
public class CustomGlideModule implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // 设置内存缓存大小为设备可用内存的10%
        int memoryCacheSizeBytes = 1024 * 1024 * 10; // 10MB
        builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));

        // 配置磁盘缓存路径与大小
        builder.setDiskCache(new ExternalDiskCacheFactory(context, "glide_cache", 50L * 1024 * 1024));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {}
}
上述代码中,setMemoryCache 替换默认的 LRU 内存缓存策略,限制缓存总量以避免 OOM;ExternalDiskCacheFactory 将缓存目录迁移至外部存储,提升大图加载场景下的稳定性。
性能调优建议
  • 在低内存设备上动态调整缓存大小
  • 使用 BitmapPool 复用位图内存
  • 结合 RequestOptions 统一占位符与错误图配置

4.2 清理策略与手动释放:trimMemory与clearMemory调用时机

Android系统在资源紧张时会回调onTrimMemory,开发者可据此释放非关键内存。该方法接收不同级别参数,反映当前内存压力程度。
trimMemory触发时机
  • TRIM_MEMORY_UI_HIDDEN:UI不可见时,适合释放UI相关资源
  • TRIM_MEMORY_BACKGROUND:应用在后台,应缩减缓存
  • TRIM_MEMORY_RUNNING_CRITICAL:系统极度缺内存,需立即释放
public void onTrimMemory(int level) {
    if (level >= TRIM_MEMORY_MODERATE) {
        // 释放图片缓存
        imageCache.clear();
    }
}
上述代码在中等及以上内存压力时清空图片缓存。level值越大,表示内存越紧张,应释放更多资源。
手动触发clearMemory
在特定场景如Activity销毁后,可主动调用ComponentCallbacks2.onLowMemory()模拟清理,确保内存及时回收。

4.3 调试工具集成:通过StrictMode与LeakCanary发现潜在问题

在Android开发中,及时发现性能隐患和内存泄漏至关重要。`StrictMode` 是系统提供的运行时检测工具,可监控主线程中的磁盘读写、网络请求等违规操作。
启用StrictMode策略
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork()
    .penaltyLog()
    .build());
上述代码配置了线程策略,用于捕获主线程中的磁盘与网络调用,并通过日志输出警告,便于开发者定位阻塞操作。
集成LeakCanary监测内存泄漏
LeakCanary是Square开源的内存泄漏检测库,集成简单且自动化程度高。添加依赖后,框架会自动监控生命周期对象的引用状态。
  • 自动检测Activity和Fragment的内存泄漏
  • 提供直观的泄漏路径堆栈信息
  • 支持自定义监控范围和过滤规则
结合使用StrictMode与LeakCanary,可在开发阶段快速暴露应用中的隐性问题,显著提升代码质量与运行稳定性。

4.4 OOM场景复盘:典型内存溢出案例分析与解决方案

Java应用中的堆内存溢出
在高并发服务中,频繁创建大对象且未及时释放,易引发java.lang.OutOfMemoryError: Java heap space。常见于缓存未设上限或批量处理数据时。

// 示例:未限制大小的缓存导致OOM
Map<String, byte[]> cache = new HashMap<>();
for (int i = 0; i < 100000; i++) {
    cache.put("key" + i, new byte[1024 * 1024]); // 每次分配1MB
}
上述代码持续向HashMap写入1MB数组,未启用LRU淘汰机制,最终耗尽堆内存。建议使用ConcurrentHashMap结合软引用或集成Caffeine等具备容量控制的缓存库。
解决方案对比
方案优点适用场景
JVM调参 (-Xmx)快速缓解临时扩容
对象池化减少GC压力高频创建/销毁
堆转储分析精准定位泄漏点生产环境排查

第五章:构建高性能图像加载体系的未来方向

随着Web应用对视觉体验要求的提升,图像加载性能已成为前端优化的关键瓶颈。未来的图像加载体系将不再局限于懒加载与CDN分发,而是向智能化、自适应化演进。
智能格式动态选择
现代浏览器支持AVIF、WebP等高效编码格式,但兼容性存在差异。可通过请求头中的 Accept 字段动态返回最优格式:
func serveImage(w http.ResponseWriter, r *http.Request) {
    accept := r.Header.Get("Accept")
    if strings.Contains(accept, "image/avif") {
        serveAVIF(w)
    } else if strings.Contains(accept, "image/webp") {
        serveWebP(w)
    } else {
        serveJPEG(w)
    }
}
基于用户行为的预加载策略
通过分析用户滚动速度与停留时间,预测即将进入视口的图像并提前加载。例如,当用户以匀速向下滚动时,系统可启动预取队列:
  • 监控 scroll 事件并计算滚动趋势
  • 结合 IntersectionObserver 判断接近阈值
  • 使用 fetch() 预加载低分辨率占位图
  • 主图在可见前 1.5 秒触发高分辨率资源请求
边缘计算赋能图像处理
利用边缘节点执行实时图像裁剪、压缩与格式转换,减轻源站压力。Cloudflare Workers 或 AWS Lambda@Edge 可实现毫秒级响应:
场景传统架构延迟边缘处理延迟
移动端适配图生成320ms90ms
高清图降级传输280ms75ms
图像请求 → 边缘节点(解析设备DPR) → 动态压缩 → 返回适配资源
手把手教学:用国产GLM-4.6替代Claude4.0,实现AI自动化编程全流程 本文提供了一份详细的教程,指导开发者使用国产GLM-4.6模型替代Claude 4.0,实现AI自动化编程。内容涵盖从获取API密钥、搭建本地环境、改造Claude Code工具到实战开发与VSCode集成的全流程,旨在帮助用户低成本、高效率地体验AI自主编程。 阅读详情

相关推荐

Yocto下载加速秘籍:用清华镜像+PREMIRRORS配置让构建速度翻倍

本文详细解析了如何通过配置Yocto的PREMIRRORS优先级策略,并利用清华大学等国内镜像源,显著加速构建过程中的源码下载。文章提供了具体的配置示例和验证方法,帮助开发者解决网络瓶颈,实现构建速度翻倍,提升开发效率。

game4的博客 276

Glide简单使用(二)

1. Glide缓存 分为两种, 内存缓存 skipMemoryCache(true) 磁盘缓存 DiskCacheStrategy.NONE 什么都不缓存, DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像 DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的) DiskCacheStrategy.ALL

人生在世 3771

YOLOv8基础环境搭建cuda+anaconda+pytorch+pycharm

首先安装NVIDIA gpu的电脑安装显卡驱动,如果安装过了,或者想使用cpu的,可以跳过这一步。打开cmd,输入nvidia-smi查看GPU的CUDA版本,可以看到CUDA版本12.3,意味着只能安装小于12.3的CUDA版本。下载完成,进行安装,建议安装在非系统盘,以后会创建比较多的环境的话,剩下的默认安装即可。,需要注册一个NVIDIA账号,然后选择CUDA对应版本的cudnn即可。,以12.2.1版本举例,选好系统参数,点击下载,,以11.6版本举例,选好系统参数,点击下载,

qq_16602159的博客 2383

Android Glide图片加载-缓存机制(内存缓存和磁盘缓存)

前言 glide的缓存机制。Glide的缓存设计是非常的先进的,考虑的场景也很周全。Glide 的缓存分为两种,一是内存缓存,另一个是硬盘缓存。 这两种缓存的作用各不相同,内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,而硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据。 内存缓存 在默认情况下,Glide自动开启内存缓存的,我们也可以通过调用skipMemoryCache(true) 方法,禁用内存缓存 RequestOptions options = new RequestO

吕氏春秋i 7044

Win10家庭版没有Hyper-V?教你一招轻松解决(含避坑指南)

本文详细介绍了在Win10家庭版中启用Hyper-V的完整实战指南。通过DISM工具链绕过系统版本限制,无需重装系统即可完整启用所有Hyper-V组件,适用于开发者测试多系统环境和安全隔离应用场景。文章包含详细操作步骤、常见问题解决方案及性能优化配置,帮助用户轻松解决Win10家庭版没有Hyper-V的问题。

weixin_29239661的博客 495

自动化测试软件设计:C# + VISA 库实现多接口(GPIB/USB)测试仪器控制

本文介绍了如何利用C#和VISA库开发支持多接口的自动化测试软件。VISA库作为标准化API,能够统一控制GPIB、USB等不同接口的测试设备。文章详细阐述了软件设计目标,包括多接口支持、统一控制、自动化脚本执行等功能。重点讲解了C#中VISA库的安装配置,并提供了设备控制类的核心代码实现,涵盖设备连接、命令发送、响应读取等关键操作。通过具体示例展示了GPIB和USB设备的连接方式,并扩展了自动化测试脚本功能。该方案具有高扩展性和维护性,适用于电子设备测试、生产线检测等多种场景,为自动化测试系统开发提供了实

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1712

Android Glide数据更新及内存缓存、硬盘缓存清理

Android Glide数据更新及内存缓存、硬盘缓存清理Android的Glide在加载图片时候内部默认使用了缓存机制,Glide的缓存机制分为两级,第一级是内存缓存,然后第二级是硬盘缓存。缓存的过程首先是在内存中缓存,然后将加载的图片资源缓存到硬盘,这样就可以在随后的再次加载中使用缓存了,Glide使用缓存时候首先要检查内存这一层级是否缓存了相应的缓存,如果有,则直接使用,如果没有,则...

weixin_33955681的博客 568

手把手教你用WKT文件在Petrel中创建自定义坐标系统(附CGCS2000转换模板)

本文详细介绍了如何在Petrel软件中利用WKT文件创建自定义坐标系统,并重点提供了CGCS2000坐标系的完整转换模板与实战步骤。通过解析坐标系统的三大支柱(大地坐标系、投影坐标系、基准转换)和WKT文件结构,指导用户从零开始构建适用于本土化项目的坐标系统,确保地质建模与空间数据处理的精度与一致性。

gpt4scribbler的博客 279

Glide 进阶篇

缓存 skipMemoryCache(true/false) 是否跳过内存缓存。 skipMemoryCache 这就表示Glide不会将图片放到内存缓存中。默认为false,所有使用时可以不用调用。 Glide.with(this) .load("地址") .skipMemoryCache(true) .into(imageView); 当跳过内存缓存时,Glide仍会使用磁盘缓存来避免重复的网络请求。

m0_48440239的博客 715

zedboard(5)spi轮询和中断

一个SPI可以有几个从设备 在程序中使用 s32 XSpiPs_SetSlaveSelect(XSpiPs *InstancePtr, u8 SlaveSel) 选择。其实就是吧对应设备的ss拉低。 备注:只选一个ss,可以不用指定。(感觉,还没测试) 这是xspips.c中定义的函数,发送和接收有 XSpiPs_Transfer 和 XSpiPs_PolledTransfer 两个函数,分别采用中断和轮询模式。    一、轮询模式 米联客参考代码,SpiPs_Init中部分和官方例程流程一样,Spi

Kiss丶小坏 5890

数据挖掘实战-基于决策树算法构建北京市空气质量预测模型

通过分析这些数据,我们将利用决策树算法建立预测模型。决策树算法具有直观易懂、分类效果好等优点,适合用于此类预测问题。我们将采用适当的方法对模型进行训练和优化,以提高预测精度。最终,我们将评估模型的预测效果,并探讨其在实际应用中的可行性和潜在价值。希望通过本实验,能为北京市的空气质量改善工作提供一定的支持。通过基于决策树算法构建的北京市空气质量预测模型的实验研究,我们在多方面取得了显著的进展。首先,我们成功地整合了来自气象、环保、交通等多个领域的大量数据,形成了一个全面而综合的空气质量分析框架。

m0_64336780的博客 2万+

Android 开发之Glide《五》缓存

前言 一、简介 缓存设置 Glide.with(this).load("url").skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL) 设置内存缓存开关:true 表示不使用内存缓存 skipMemoryCache() 设置磁盘缓存模式: diskCacheStrategy() 可以设置4种模式: DiskCacheStrategy.NONE:表示不缓存任何内容。 DiskCacheStrategy.DATA:表示

qq_31469589的博客 1689

【AN7581】AN7581 SDK编译环境搭建操作说明

安装编译需要的工具包。

wgl307293845的博客 338

Glide源码解析3 -- 缓存功能

一 前言 我们知道,Glide的一大优势就是它的缓存功能是它的一大优势之一,虽然其他图片框架也有缓存功能比如Picasso,但是Picasso只能缓存原始图片,而Glide却可以缓存多种规格的图片,也就是说可以通过ImageView的大小来缓存相应的图片大小;同时通过API灵活的制定缓存策略,实现高效缓存。 福利:这里附上各个图片框架的对比图 二 缓存机制简介 2.1 缓存对象 Glide缓存对象分为两种,也就是上面提到的分别是原始图片和经过转换后的图片: 原始图片:就是图片源的初始大小和分辨率 转换后的

qq_39431405的博客 2039

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深入探究Glide的缓存机制

亲自执笔,带你学习Glide缓存的基本用法,源码实现,以及高级技巧。

郭霖 2081

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Glide 基础配置BaseRequestOptions

1 设置缓存:DiskCacheStrategy skipMemoryCache :内存缓存策略 glide默认是打开内存缓存的,如果想关闭的话设置为true true 关闭内存缓存,false 打开内存缓存(默认) diskCacheStrategy:磁盘缓存策略 DiskCacheStrategy.NONE 关闭磁盘缓存 DiskCacheStrategy 的枚举意义: DiskCacheStrategy.NONE: 表示不缓存任何内容。 DiskCacheS

ysh_123 1570

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android图片加载框架最全解析(三),深入探究Glide的缓存机制

可以看到,只需要调用skipMemoryCache()方法并传入true,就表示禁用掉Glide的内存缓存功能。没错,关于Glide内存缓存的用法就只有这么多,可以说是相当简单。但是我们不可能只停留在这么简单的层面上,接下来就让我们就通过阅读源码来分析一下Glide的内存缓存功能是如何实现的。其实说到内存缓存的实现,非常容易就让人想到LruCache算法(Least Recently Used),也叫近期最少使用算法。它的主要算法原理就是把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近

2401_84149836的博客 600

Android进阶-第三方框架使用汇总

image loading 框架: 1.1 Glide 1.1Glide:一、Glide-Getting StartedGlide:Glide就像Picasso,能从许多资源上加载和显示图片,也照顾了缓存和做图片操作的时候保持一个低的内存影响,它已经被官方谷歌应用程序(如Google I / O的应用程序2015)和Picasso一样受欢迎,在本系列中,我们将探索Glide在Picas

王涛的博客 1万+

Glide 这样用,更省内存!!!

(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总)面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验,

2401_84123056的博客 1173

Glide使用及原理分析

Glide是一款非常好用的图片加载框架那么它具体好用在哪里呢?总所周知,在android开发中有几大令人头疼的问题,比如内存泄漏,线程问题,生命周期,这些问题在Glide的身上都不需要关心,下面就具体来介绍一下Glide的使用及原理吧。httpshttpshttpshttps。...

java521666的博客 2197

Glide入门教程——7. 缓存基础

Glide — 缓存基础 原文:Caching Basics 作者:Norman Peitek 翻译:Dexter0218 我们学习完了加载、显示和处理图片,我们将会向前推进学习优化处理。一个成功的高效的图片加载的基本功能是缓存。这篇文章将学习Glide中的缓存的基础知识。 文/签到钱就到(简书作者) 原文链接:http://www.jianshu.com/p/f5cc

苏白的专栏 1114

【Glide 】框架在内存使用方面的优化

理解源码不是最终目的,纸上得来终觉浅,绝知此事要躬行,学习优秀的代码,最重要的是掌握其中的思想,并应用到自己的项目中

qq_23049111的博客 1150

Glide 缓存机制源码解读

Glide 缓存机制 对于Glide的来说,强大的缓存机制一直是其受欢迎的重要前提,那么Glide缓存机制具体是什么呢,而其实现的原理又是什么呢?这篇文章将在源码层面对Glide缓存机制进行剖析,对Glide有更深层次的了解,那么就直接步入主题吧! 本文章基于Glide 4.11.0 版本 缓存机制 谈到缓存机制,我们常常会想到在Android中的一个缓存流程,也就是三级缓存: 内存缓存:优先加载,速度最快 本地缓存:次优先加载,速度快 网络缓存:最后加载,速度慢,需要网络 正常情况下,我们都会对于

number_cmd9的博客 532

解决-Glide使用DiskLruCache缓存Gif图失效

1.Glide 2.DiskLruCache 3.Gif

HuangLin的博客 2890

如何在Android应用当中避免内存溢出问题

一、内存溢出 现在的智能手机内存已经足够大,但是对于一个应用程序来说智能手机当中稀缺的内存,仍然是应用程序的一大限制。在Android应用程序开发当中,最常见的内存溢出问题(OOM)是在加载图片时出现的,尤其是在不知道图片大小的情况下。 潜在的内存溢出操作主要包括以下几点: 从网络当中加载用户特定的图片。因为直到我们在下载图片的时候我们才知道图片的大小。 向Gallery加载图片。因为...

java开发指南博客 【转载】 151

Glide 这样用,更省内存!!!(1)

其实 LruResourceCache 和 LruBitmapPool 中,对 和 的操作是类似的,这里就以 LruBitmapPool 举例。/gm-LruBitmapPool.png在 LruBitmapPool 中,会根据回调的方法以及参数,调用 或者 ,其实最终都是调用的 方法。它用于裁剪当前缓存资源的个数。/gm-trimtosize.png可以看到,根据裁剪的目标尺寸,会去回收多余的 Bitmap 到合适的目标大小,以达到清理内存的目的。GlideModule 是 Glide 提供的一个

2401_84407942的博客 1051
上一篇: Kotlin Multiplatform数据库方案选型(跨平台数据同步难题破解)
下一篇: 告别手动刷新UI:Kotlin数据绑定自动化实现的6种方案
MessyInk
博客等级 码龄11年 136粉丝 1992原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值