首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android在列表视图中从web加载图片时出现`OutOfMemoryException`

基础概念

OutOfMemoryException 是 Android 开发中常见的异常,表示应用程序试图申请超过其分配的内存限制。在列表视图(如 ListViewRecyclerView)中从网络加载图片时,如果图片数量多且图片较大,很容易导致内存不足。

相关优势

  1. 图片缓存:通过缓存机制减少重复下载和解析图片的开销。
  2. 图片压缩:在加载图片时进行压缩,减少内存占用。
  3. 异步加载:在后台线程加载图片,避免阻塞主线程。

类型

  1. 内存泄漏:某些对象未被正确释放,导致内存持续占用。
  2. 图片过大:加载的图片尺寸过大,超出了可用内存。
  3. 重复加载:同一张图片被多次加载,导致内存占用过高。

应用场景

在列表视图中显示大量图片,如新闻列表、商品列表等。

问题原因

  1. 图片尺寸过大:加载的图片尺寸远大于显示尺寸,导致内存占用过高。
  2. 重复加载:同一张图片被多次加载,导致内存占用过高。
  3. 内存泄漏:某些对象未被正确释放,导致内存持续占用。

解决方法

  1. 使用图片加载库:如 Glide 或 Picasso,它们提供了图片缓存、压缩和异步加载等功能。
  2. 调整图片尺寸:在服务器端或客户端对图片进行缩放,减少内存占用。
  3. 避免重复加载:使用图片缓存机制,确保同一张图片只加载一次。
  4. 检查内存泄漏:使用工具如 LeakCanary 检查并修复内存泄漏问题。

示例代码(使用 Glide)

代码语言:txt
复制
import com.bumptech.glide.Glide;

// 在适配器中加载图片
public void onBindViewHolder(ViewHolder holder, int position) {
    String imageUrl = getImageUrl(position);
    Glide.with(holder.itemView.getContext())
         .load(imageUrl)
         .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) // 调整图片尺寸
         .into(holder.imageView);
}

参考链接

通过以上方法可以有效解决在列表视图中从网络加载图片时出现的 OutOfMemoryException 问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

浅谈 Web 图像优化

并且多大的缩放下都能保证清晰,矢量格式不能满足复杂的图像,例如照片,高清。...合并雪碧(sprite):移动端多情况下,可以将多合并到一个图中,通过 CSS 定位背景的形式来引用图片,可以有效减少 HTTP 请求。...这种方式很智能,浏览器根据你的 sizes, w 列表中选择最合适的图像来调用显示。 如果我们需要更精确的控制浏览器什么口大小下显示多大的图像,可以使用 picture 元素。...当口大于 960 像素时,会加载 960.jpg。大于 768 像素时,会加载 768.jpg。口小于768,则加载默认图像。...medium 下的实现方式更为复杂点,是缩略图加载完毕后,绘制到 canvas 画布,再通过一个自定义的模糊函数,类似于 StackBlur,同时请求高质量。等到请求完,再隐藏画布。

1.4K90

构建更快的 Web 体验 - 使用 postTask 调度器

正文从这开始~~ 你有没有经历过打开一个网页,页面上点击多次才有反应?或者轮播图上滑动图片时卡顿和不自然?虽然这种经历经常发生,但是我们可以利用工具来提高用户的体验和响应速度。...许多性能方面的努力集中页面的初始加载上,Airbnb 的目标是提高页面加载后的用户体验。他们许多方面使用 postTask 调度器,包括预加载轮播图中的图像和使地图更具响应性。...例如,处理轮播时,我们可以使用 postTask 调度器将图像预加载任务放入低优先级队列中,以确保关键任务得到优先处理。...图片轮播预加载的触发时机: 列表屏幕上显示大约 50% 时 延迟一秒;如果用户仍在查看它,则在轮播中加载下一张图片 如果用户滑动图像,则预加载下三张图像,每张图片之间间隔 100ms 如果轮播一秒计时器结束之前的任何时候离开口...我们设置了一个阈值为 0.5 ,这意味着元素的一半必须在视图中才会被视为 “可见”。我们还设置了 skip 属性,以便在我们预加载下一张图片时跳过这个元素。

13410
  • 私人订制Android本地图片选择器

    效果 需求分析 网格布局显示本地图片 支持图片多选 支持选中的图片预览 未选择图片时不可预览 由已选多变为无时可退出图片选择页面 图片已选达到上限后依然可以跳转图片选择页面 第三方框架使用 史上最强的安卓图片选择器...选择图片时 本人实现的可支持最大图片数量是5,图片选满的时候依然显示“+”,用以跳转图片选择页面选择其他图片。...“添加”图片 且配置的时候传入的是添加了一张图片以后的图片列表: // 不过滤图片,而是将之前选中的图片设置为选中状态 funConBuilder.setSelected(mPhotoList); 所以会导致界面无法跳转...mSelectPhotoList初始化 考虑到选中图片的列表声明时已经初始化,所以不用担心图片返回的回调事件传入空指针对象。...未选择图片时不显示预览按钮 通过布局的id——iv_previewPhotoSelectActivity中查找,refreshSelectCount方法里找到了对预览按钮可见性的设置:

    1.4K30

    React Native 性能优化指南

    Web 开发中,99% 的情况下都是一个 Virtual DOM 对应一个真实 DOM 的,那么 React Native 中也是一一对应的关系吗?我们写个简单的例子来探索一下。...加载的场景里,经过实践,iOS 不管怎么折腾,表现都比较好,但是 Android 就容易出幺蛾子。下面我们就详细说说 Android 端如何优化图片。...resize:小容器加载的场景就应该用这个属性。原理是图片解码之前,会用算法对其在内存中的数据进行修改,一般图片大小大概会缩减为原图的 1/8。...加载网络图片时,我们可以使用 React Native 的 ?...而且 debug 指示条可以看出,这批元素会一直存在于内存中。 2.Viewport 口高度,就是用户能看到内容,一般就是设备高度。

    5.3K200

    写在 2021 的前端性能优化指南

    加载性能。如何更快地把资源服务器中拉到浏览器,如 http 与资源体积的各种优化,都是旨在加载性能的提升。 渲染性能。如何更快的把资源浏览器上进行渲染。...渲染优化: 虚拟列表优化 13. 渲染优化: 请求及资源缓存 14. Web Worker 15. WASM 1....一般用以加载其它路由资源,如当页面出现 Link,可 prefetch 当前 Link 的路由资源。...渲染优化: 虚拟列表优化 这又是一个老生常谈的话题,一般口内维护一个虚拟列表(仅渲染十几条条数据左右),监听口位置变化,从而对视口内的虚拟列表进行控制。...Web Worker 试举一例: 纯浏览器中,如何实现高性能的实时代码编译及转换?

    1.3K40

    H5前端性能测试快速入门

    用户可操作时间:页面开始加载到用户操作可响应的时间。...上述各种时间指标应根据当前H5的具体情况,选择合适的测试指标 WebView相关: android和IOS上测试H5性能,测试员还应该关注因加载H5而引起的app常规性能指标。...图为PCAP Web Performance Analyzer解析pcap包的结果,图中我们可以看出,21个http请求中,有7个是统计点发出的请求。...非200的返回码意味着本次请求没有实质性的收获,如上图所示的两次非200请求返回值: 404:上图请求图片时出现404:一方面,可能图片本身在H5中就不展示,所以这里直接去掉多余的连接就好了。...302:请求音乐时出现302重定向:图中可以明显看出两次请求后才获取到背景音乐,用户侧可能会感知是音乐加载速度慢。 6、未使用CDN,未设置cache ?

    1.9K60

    H5前端性能测试快速入门

    (2)图片地图:是一种小合并大的方式,和雪碧相似,区别仅在实现原理上有不同,雪碧是通过CSS的方式来呈现图片的某个局部,而图片地图是html代码的方式来控制显示区域。...WebView相关: android和IOS上测试H5性能,测试员还应该关注因加载H5而引起的app常规性能指标。...图为PCAP Web Performance Analyzer解析pcap包的结果,图中我们可以看出,21个http请求中,有7个是统计点发出的请求。...非200的返回码意味着本次请求没有实质性的收获,如上图所示的两次非200请求返回值: 404:上图请求图片时出现404:一方面,可能图片本身在H5中就不展示,所以这里直接去掉多余的连接就好了。...302:请求音乐时出现302重定向:图中可以明显看出两次请求后才获取到背景音乐,用户侧可能会感知是音乐加载速度慢。 6、未使用CDN,未设置cache ?

    2.8K83

    关于移动端适配,你必须要知道的

    web中,浏览器为我们提供了 window.devicePixelRatio来帮助我们获取 dpr。...实际上,苹果提出视网膜屏幕开始,才出现设备像素比这个概念,因为在这之前,移动设备都是直接使用物理像素来进行展示。...四、口( viewport)代表当前可见的计算机图形区域。 Web浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的 UI, 菜单栏等——即指你正在浏览的文档的那一部分。...如上图,我们描述设备独立像素时曾使用过这张浏览器调试移动端时页面上给定的像素大小就是理想口大小,它的单位正是设备独立像素。...如: dpr=2的屏幕上展示两倍 (@2x), dpr=3的屏幕上展示三倍 (@3x)。 ?

    1.9K41

    关于移动端适配,你必须要知道的

    web中,浏览器为我们提供了 window.devicePixelRatio来帮助我们获取 dpr。...实际上,苹果提出视网膜屏幕开始,才出现设备像素比这个概念,因为在这之前,移动设备都是直接使用物理像素来进行展示。...四、口( viewport)代表当前可见的计算机图形区域。 Web浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的 UI, 菜单栏等——即指你正在浏览的文档的那一部分。...如上图,我们描述设备独立像素时曾使用过这张浏览器调试移动端时页面上给定的像素大小就是理想口大小,它的单位正是设备独立像素。...如: dpr=2的屏幕上展示两倍 (@2x), dpr=3的屏幕上展示三倍 (@3x)。 ?

    2.1K10

    关于移动端适配,你必须要知道的

    web中,浏览器为我们提供了 window.devicePixelRatio来帮助我们获取 dpr。...实际上,苹果提出视网膜屏幕开始,才出现设备像素比这个概念,因为在这之前,移动设备都是直接使用物理像素来进行展示。...四、口( viewport)代表当前可见的计算机图形区域。 Web浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的 UI, 菜单栏等——即指你正在浏览的文档的那一部分。...如上图,我们描述设备独立像素时曾使用过这张浏览器调试移动端时页面上给定的像素大小就是理想口大小,它的单位正是设备独立像素。...如: dpr=2的屏幕上展示两倍 (@2x), dpr=3的屏幕上展示三倍 (@3x)。 ?

    2K20

    加载的实现原理

    前端工程师在做页面优化的时候,如果页面中是类似图片列表的结构,会考虑使用懒加载(Lazy-Load)技术来优化页面的加载速度,今天就带大家来探究一下懒加载的原理。...这里我们用了一个img的背景设置图片的默认显示图片,页面显示如下: ? 接下来就是实现图片懒加载的功能了,如何做呢?...可以看到默认情况下图片显示的是gif,用户拖动滚动框,当图片出现在浏览器的可视区域后,我们将图片的src值设置为datasrc,这样的话图片就实现了懒加载功能。...然后我们可以通过图片的getBoundingClientRect() 方法来获取返回元素的大小及其相对于口的位置。...这里需要注意的是,我们设置了一个count变量,每次图片显示,将count递增,再次检测图片时count开始检测,防止重复检测。

    1.3K31

    Android学习笔记 - BitmapFun解析

    不多说我们先来看BitmapFun的主要类: ImageWorker:这个是加载图片的核心类,建议大家看源代码从这个类看起。它的主要功能是内存/磁盘缓存中加载图片,或者是网络上下载。...这里第一要使用缓存,第二网络上下载,必然要使用异步线程,所以这里图中大家也可以看到它有两个关联类BitmapWorkerTask(继承自AsynTask)和ImageCache, 分别用来处理异步和缓存...这里也可以看到它有一个关联类DiskLruCache。 DiskLruCache: 关于这个类网上有一些详尽的解释文章。...网络下载图片。这里要澄清一点,processBitmapImageWorker中是一个抽象方法,并没有实现体,本示例中,是ImageFetcher中实现的。...protected abstract Bitmap processBitmap(Object data);  最后就是View这一层如何来使用了,图中可以看出,View这一层基本上操作ImageFetcher

    33520

    🤯 没 2 年 React Native 开发经验,你都遇不到这些坑

    CSS 那么多的滤镜属性,只支持模糊效果,不过个人基本没遇到过图像滤镜需求 加载网络图片时,必须指定图片宽高,若不设置尺寸默认为 0 Android 上图片尺寸非常大时(貌似是 5000px?)...,图片会直接加载不出来,不过这种场景很少很少,基本都会瓦片分步加载,要不然大会引起 OOM 的 iOS/Android 对 webp 的支持也不是开箱即用的,需要分别配置: iOS 使用 SDImageWebPCoder...提供支持 Android 使用 fresco 提供支持 具体配置方案可以参考 react-native-webp-format[4] Android 不支持点九 5.Modal RN 官方之前提供的...第二个是 automaticallyAdjustContentInsets 属性,有时候 iOS 滚动列表上会出现莫名其妙的空白区域,这个是 iOS Native 层实现的,RN 具体的触发时机我没有做详细的测试...7.FlatList FlatList 主要是注意 3 个点: FlatList 提供自定义的头部/底部/空白/分割线组件,比一般的 Web 组件封装更彻底一些 React 渲染列表的时候会要求加 key

    4.3K20

    WebView 的一切都在这儿

    WebChromeClient 2.回调顺序 3.口(viewport) 4.管理 Cookies 5.缓存(Cache) 6.预加载(Preload) 6.与Javascript交互 8.地理位置(...3 回调顺序 页面加载回调顺序: 资源加载回调: 发生重定向时回调: 直接loadUrl的回调: 后退/前进/刷新 时回调: 关于window.location 假设A页面跳转到B页面 如果页面B中直接输出...当回退到页面A时会再执行跳转,这会导致回退功能看起来不正常,需要快速回退两次才能回到A页面 4 口(viewport) https://developer.android.com/guide/webapps...你可以指定数个口属性,比如尺寸和初始缩放系数(initial scale)。其中最重要的是口宽度,它定义了网页水平方向的可用像素总数(可用的CSS像素数)。...多数 Android 上的网页浏览器(包括 Chrome)设置默认口为一个大尺寸(被称为"wide viewport mode",宽约 980px)。

    2.1K60

    【适配】425- 彻底搞懂移动Web开发中的viewport与跨屏适配

    口范围内的图像会以剪切的形式,投影到到世界坐标窗口中,完成图像的可视化展示。 Web 浏览器中,口是整个文档的可见部分。如果文档大于口,则用户可以通过滚动来移动口。...如这张某宝的商品放大效果,左半图为计算机看到的逻辑层画布,上方半透明选框为口(viewport),右半图为浏览器窗口,即用户看到的部分。 逻辑关系简单清晰。...如果浏览器和针对 PC 制作的网页都不做任何处理,那么窄屏设备上加载网页,我们看到的效果便是默认显示网页的左上角部分,然后通过水平和竖直方向的滚动来浏览网页的其他部分。...Android 和 iOS 不同版本不同厂商的 Web 容器中,此属性的表现可能存在较大程度的不一致,请谨慎使用。...滚动到视图中之前,口外部的内容屏幕上不可见。 ●当前可见的口部分称为可视口。这可以小于布局口,例如当用户进行缩放缩放时。该布局口保持不变,但视觉口变小。

    3K30

    彻底搞懂移动Web开发中的viewport与跨屏适配

    口范围内的图像会以剪切的形式,投影到到世界坐标窗口中,完成图像的可视化展示。 Web 浏览器中,口是整个文档的可见部分。如果文档大于口,则用户可以通过滚动来移动口。...如这张某宝的商品放大效果,左半图为计算机看到的逻辑层画布,上方半透明选框为口(viewport),右半图为浏览器窗口,即用户看到的部分。 逻辑关系简单清晰。...如果浏览器和针对 PC 制作的网页都不做任何处理,那么窄屏设备上加载网页,我们看到的效果便是默认显示网页的左上角部分,然后通过水平和竖直方向的滚动来浏览网页的其他部分。...Android 和 iOS 不同版本不同厂商的 Web 容器中,此属性的表现可能存在较大程度的不一致,请谨慎使用。...滚动到视图中之前,口外部的内容屏幕上不可见。 ●当前可见的口部分称为可视口。这可以小于布局口,例如当用户进行缩放缩放时。该布局口保持不变,但视觉口变小。

    3.4K20

    Web图像组件设计的最佳实践

    较大的口上放大时不会超过图像的固有尺寸,容器宽度为 100% Layout = Fixed:不管什么设备上,宽度和高度是固定的。...Layout = Responsive:根据容器不同口上的宽度缩小或放大,保持宽高比。...预加载 上面提到了,图像的文件大小越大,下载所需的时间就越长。网页中的大可能是触发最大内容绘制指标 ( LCP )的最重要元素,对一些大进行预加载可能是个好主意。...渐进式加载 所谓渐进式加载,就是实际图像加载时先显示质量较差的占位符,它可以与懒加载结合使用,从而提高了感知性能并增强用户体验。...效果 下面是 leboncoin 使用了 Image 组件后的优化效果: LCP 2.4s 下降到 1.7s,为页面下载的总图像资源大小 663kB 增加到了 326kB(懒加载的图片大小约为

    2K20

    Android系统Bitmap内存分配原理与优化

    尤其是游戏中心2020末~2021初的几个重要版本,上线了很多内容相关的feature,引入大量图片、视频列表,从而导致线上OOM占比上升。...在这篇文章中,笔者将讲解一张看似普通的Bitmap对内存的占用,介绍Android Studio中帮助我们分析图片占用内存的工具,举例说明流行的两大图片加载框架:Glide、Picasso加载片时使用内存的不同方式...通过Android Studio进行heap dump,从而看图片所占用的内存。首先我们将显示图片时的内存快照保存下来。...小技巧:如何查看dump文件中的图片 调试时,如果我们手头只有一个dump文件,往往需要还原图片内容,以帮助定位问题。有两种方式可以dump文件里提取原图片。...设计师提供的图片都是高分辨率的,我们所面临的场景是将大加载到小ImageView中。

    1.2K20

    使用相交观察器和SQIP进行渐进式图像加载

    使用延迟加载技术将意味着用户只加载他们口中看到的内容,而与低质量图像相结合则意味着双重网页性能会带来麻烦 在这篇文章中,我将通过我所经历的步骤和您如何开始使用这种技术来谈谈您自己 开始入门 我们继续之前...,然后再确定它是否图中。...加载图像后,我们不需要再观察它,并且使用unobserve()将从交叉观察者的条目列表中将其删除。而已!...尝试SQIP很有趣,其实这种做法就是首屏加载图像时,以低质量模糊图像加载过渡到清晰图像,体积上,经过SQIP处理后,与实际图片比较起来,可以看出容量还更小,更多的做法,各个网站上看出,他们的处理方式都很类似...,页面上同一张图片用两种存储格式 当触发某个条件,加载到该图片时,先加载低质量体积小的图片,然后快速的被该实际图片尺寸给替换。

    1.8K20

    Android drawable微技巧,你所不知道的drawable的那些细节

    android:src="@drawable/android_logo" /> ImageView控件中指定加载android_logo这张,并把...现在运行一下程序,效果如下所示: 由于我的手机分辨率是1080*1920像素的,而这张图片的分辨率是270*480像素的,刚好是手机分辨率的四分之一,因此从上图中也可以看出,android_logo...总体匹配规则就是这样,那么比如说现在终于drawable-mdpi文件夹下面找到android_logo这张了,但是系统会认为你这张是专门为低密度的设备所设计的,如果直接将这张在当前的高密度设备上使用就有可能会出现像素过低的情况...那么同样的道理,如果系统是drawable-xxxhdpi文件夹下面找到这张的话,它会认为这张是为更高密度的设备所设计的,如果直接将这张在当前设备上使用就有可能会出现像素过高的情况,于是会自动帮我们做一个缩小的操作...可以这样来分析,根据我们刚才所学的内容,如果将一张图片放在低密度文件夹下,那么高密度设备上显示图片时就会被自动放大,而如果将一张图片放在高密度文件夹下,那么低密度设备上显示图片时就会被自动缩小。

    2.5K80
    领券