在android应用程序中,你会遇到因为加载图片而导致的内存溢出,因此在加载图片的时候你需要格外的注意。首先我们分析一下内存溢出的几个原因:
- 移动终端系统一般是有限的内存资源,而android系统为每一个程序提供16M的内存空间。
- 图片资源非常占用系统资源,尤其是高清图片,举例来说三星Galaxy Nexus照相的分辨率能达到2592x1936像素,假设加载时采用ARGB—888格式,系统将占用(2592x1936X4)bytes,这将大大超出系统分配内存
- 在android应用中可能会经常出现在一屏幕上显示多个图片的情况,如listview,GridView,viewpage等,这将大大的消耗内存资源。
如何解决以上的问题呢 ?
提前预读取图片尺寸和类型
BitmapFactory
类提供了许多创建图片的方法( (decodeByteArray()
, decodeFile()
,decodeResource()
, etc),根据你图片资源的不同选择对应的方法,在这些方法中系统会尝试去为图片分配内存,这样容易导致OOM,然而每一个方法提供一个额外的参数 BitmapFactory.Options,
设置inJustDecodeBounds
为true,在创建图片是则会避免去分配内存,同时返回一个null对象,但图片的高度,宽度,MIME等信息都能获取,通过这种方式去读取图片信息,避免分配内存。
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType; |
要避免OOM,在创建图片之前检查其大小是非常必要的,除非你明确知道图片不会超出你可用的内存。
加载缩小后的图片到内存
假设我们已经知道图片的尺寸信息,这样我们就可以决定是将图片全部加入到内存中还是加载缩小的图片到内存中。
-
预估加载整张图片到内存中所占用的大小
-
考虑加载图片到内存后当前应用还有多少内存可用
-
加载到UI对象中的尺寸
-
当前设备的屏幕尺寸及density
如何计算缩放比例
public static int calculateInSampleSize( BitmapFactory.Options options,int reqWidth,int reqHeight){ // Raw height and width of image finalint height = options.outHeight; finalint width = options.outWidth; int inSampleSize =1; if(height > reqHeight || width > reqWidth){ finalint halfHeight = height /2; finalint halfWidth = width /2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while((halfHeight / inSampleSize)> reqHeight &&(halfWidth / inSampleSize)> reqWidth){ inSampleSize *=2; } } return inSampleSize;}
计算出缩放比例后,加载图片到内存
public static Bitmap decodeSampledBitmapFromResource(Resources res,int resId, int reqWidth,int reqHeight){ // First decode with inJustDecodeBounds=true to check dimensions finalBitmapFactory.Options options =newBitmapFactory.Options(); options.inJustDecodeBounds =true; BitmapFactory.decodeResource(res, resId, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds =false; return BitmapFactory.decodeResource(res, resId, options);}
相关推荐
在Android开发中,图片加载是应用中不可或缺的一部分,特别是在处理大量图片或者实现图库效果时。本主题将深入探讨如何利用强大的图片加载类来实现高效、流畅的图库效果,并结合Handler这一Android消息处理机制进行...
在Android开发中,异步加载图片是一项至关重要的技术,尤其对于那些包含大量图像的移动应用而言,如社交网络、电商应用等。异步加载能够提高用户体验,避免UI线程阻塞,防止应用出现"卡死"现象。在这个"Android异步...
在布局文件中,将自定义的进度条与ImageView放在一起,并通过代码设置图片加载监听器,将进度回调传递给进度条。这样,当图片开始加载时,进度条也会同步显示加载进度。 5. **性能优化** 为了保证流畅的用户体验...
在Android应用开发中,图片加载是一项常见的任务,尤其是在处理大量图片或者网络图片时,为了提供良好的用户体验,我们通常会采用异步加载的方式。本篇将深入探讨Android平台上的图片异步加载策略,以及如何加载网络...
5. **监听加载状态**:通过监听图片加载库的事件回调,可以确保在图片加载完成后再显示,避免在ViewHolder复用时出现混乱。 6. **优化滚动行为**:在RecyclerView滚动时,可以暂停或取消不再可见的图片加载任务,只...
综上所述,Android图片加载优化涉及多个层面,包括Bitmap的合理使用、选择合适的图片库、异步加载、缓存策略、压缩和预加载等。开发者应结合实际项目需求,综合运用这些技术,以实现高效、流畅且内存友好的图片加载...
在Android开发中,将网络上的图片加载到ImageView控件上是一项常见的需求,特别是在构建社交应用、电商应用或者新闻阅读类应用时。这个过程涉及到多个关键知识点,包括网络请求、图片缓存策略、线程管理以及UI更新等...
Glide是一款由Google推荐的Android图片加载库,它专为Android平台设计,用于在ListView、GridView等滚动视图中加载和显示图片。Glide的出现解决了Android原生Bitmap操作中的许多问题,如内存管理不当导致的OOM(Out...
### Android图片加载与使用介绍 #### 一、加载框架Glide与Picasso 在Android开发过程中,图片加载是一项常见的需求。为了提高应用性能并优化用户体验,开发者通常会选择使用专门的图片加载库。其中,**Glide** 和 ...
总的来说,ImageLoader作为一款成熟的Android图片加载框架,其异步加载、缓存机制、图片处理和丰富的配置选项等特性,使得它在处理图片显示问题时表现优异。对于希望提升应用性能和用户体验的开发者来说,理解和掌握...
Glide是一个流行的Android图片加载库,它以其高效、易用和强大的功能而闻名。本篇将详细讲解如何在Android应用中使用Glide加载SVG图像。 首先,我们需要了解SVG的基本概念。SVG是一种基于XML的图形语言,它可以描绘...
在Android应用开发中,"Android App 启动时显示正在加载图片"是一个常见的用户体验优化策略。这个过程通常称为启动画面或者加载屏幕,它的目的是在应用程序的实际内容加载完成之前,为用户提供一个平滑的过渡,避免...
在"Demo4FileManager"这个文件中,可能包含了实现这些功能的代码示例,包括文件管理和图片加载的具体实现。通过研究和学习这个Demo,开发者可以更好地理解和掌握如何在Android应用中有效地异步加载图片。
4. **第三方库**:Picasso和Glide是最受欢迎的Android图片加载库。它们提供了强大的缓存机制,自动处理图片尺寸缩放,避免内存溢出,同时支持图片的异步加载和占位符显示。Picasso和Glide的API简洁,易于集成,是...
在Android应用开发中,图片加载是一项关键任务,尤其是在处理大量图片或者网络图片时。"Android异步加载图片"是一个常见的需求,它涉及到用户体验优化、内存管理以及线程安全等多个方面。这里我们将深入探讨这个主题...
本文将深入探讨如何在Android的TextView中正确加载包含文字和图片的HTML内容,并解决图片显示为小方块的常见问题。 首先,我们要了解Android中的TextView默认并不支持HTML解析和渲染。为了使TextView能够处理HTML,...
在 Android 开发中,加载大图片时经常会出现内存溢出的问题。这是由于大图片的解码需要大量的内存空间,从而导致应用程序崩溃。因此,解决加载大图片时的内存溢出问题是非常重要的。 一、使用 BitmapFactory....
4. **图片加载优化**:使用如`WebSettings.setBlockNetworkImage(true)`阻止网络图片的自动加载,然后在JavaScript中添加逻辑,在图片进入视口时手动加载。 5. **资源预加载**:如果有必要,可以预先加载一些关键...
Picasso 是一个由 Square 公司开发的简单易用的图片加载库,它极大地简化了 Android 应用中的图片处理工作。Picasso 支持从网络、内存或本地文件系统加载图片,并提供了丰富的功能,如自动调整图片大小、图片变换...
在Android应用开发中,图片加载是一项重要的任务,尤其是在处理用户界面和用户体验时。Picasso是一个由Square公司开发的流行图片加载库,它简化了图片的加载、缓存和显示过程。本文将深入探讨Picasso在Android中的...