Android 性能优化——之图片的优化

简介: Android 性能优化——之图片的优化  在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源。相对来说,其他的资源的影响会小一点。这里我就先对图片资源的优化进行一下讲解,如果有什么说的不对的,希望大神指正一下。

Android 性能优化——之图片的优化

 在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源。相对来说,其他的资源的影响会小一点。这里我就先对图片资源的优化进行一下讲解,如果有什么说的不对的,希望大神指正一下。

  1、首先我们可以对图片进行二次采样,从本质上减少图片的内存占用。就是将大图片缩小之后放入到内存中,以实现减小内存的目的。代码如下:

 1 //创建缩略图
 2     private Bitmap onCreateThumbnail(String filePath2, int i) {
 3         
 4         //得到选项
 5         BitmapFactory.Options options=new BitmapFactory.Options();
 6         //设置为不读内容,值读取边界值
 7         options.inJustDecodeBounds=true;
 8         //通过编辑,得到边界值,并存入到option中
 9         BitmapFactory.decodeFile(filePath2,options);
10         //得到缩放比例
11         int ratiowidth=(options.outWidth)/i;
12         //赋值缩放比例
13         options.inSampleSize=ratiowidth;
14         //设置显示的图片格式
15         options.inPreferredConfig=Config.RGB_565;
16         //设置为读取内容,
17         options.inJustDecodeBounds=false;
18         //得到缩略图
19         return BitmapFactory.decodeFile(filePath2, options);
20     }

 

    当然现在有很多的第三方框架可以快速的实现这个功能,如Picasso等,其用法只是调用一下方法就可以了,相当对来说更容易(不会的朋友,可以在网上搜一下,很简单实    用的框架)。

  2、其次就是采用三层缓存架构,提高图片的访问速度。三层缓存架构是内存-文件-网络。

    内存是访问速度最快的部分但是分配的空间有限,所以不可能占用太多。其中内存缓存可以采用LRU算法(最近最少使用算法),来确定要删除内存中的那些图片,保存那   些图片。

    文件就是将图片保存到本地,可以使SD卡中,也可以是手机内部存储中。

    网络就是访问网络下载图片,进行图片的加载。

  3、常见的pngJPGwebp等格式的图片在设置到UI上之前需要经过解码过程,而图片采用不同的码率,也会造成对内存的占用不同。下面介绍几种常见的解码率:

    1)ALPHA_8格式的解码率,此时图片只有alpha值,没有RGB值,一个像素占用一个字节,内存占用是最小的,但是也是最不清晰的一种,极易照成画面失真,不建议使   用。

    2)ARGB_4444 格式的解码率,这种格式的图片,看起来质量太差,已经不推荐使用。 而强烈推荐使用ARGB_8888来代替。一个像素占用2个字节,alpha(A)      值,Red(R)值,Green(G)值,Blue(B)值各占4个bites 。 共16bites,即2个字节

    3)ARGB_8888 格式的解码率,一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites , 共32bites , 即4个字节。这是一种高   质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。

    4)RGB_565格式的解码率,一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明, Red(R)值占5个bites ,Green(G)值占6个bites ,Blue(B)值占5    个bites,共16bites,即2个字节。 对于半透明颜色的图片来说,该格式的图片能够达到比较好的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销,因此它是一  个不错的选择。

  总的来说,比较推荐用最后一种,性能较好,且没有alpha值,系统不用进行二次的渲染,可以很大的提高效率和性能。

 

  4、最后一点,也是图片优化最重要的一点。重用Bitmap.

    我们都知道bitmap会占用大量的内存空间,如下图:

 

    所以可以重用已存在的bitmap内存区域。通过inBitmap属性可以使提升Bitmap循环效率。内存使用如下图:

 

    使用这个属性,可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码的bitmap会尝试去使用之前那张bitmapheap中所占据的pixel data内存区域,而不是去问内存  重新申请一块区域来存放bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数 量的内存大小。

 代码:

//得到选项

BitmapFactory.Options options=new BitmapFactory.Options();

options.inBitmap=mCurrentBitmap;

mCurrentBitmap=BitmapFactory.decodeFile(filename,options);

 

 

 

    使用这个属性需要注意一下几个限制条件:

    1、在SDK 11 -> 18之间,重用的bitmap大小必须是一致的,例如给inBitmap赋值的图片大小为100-100,那么新申请的bitmap必须也为 100-100才能够被重用。从   SDK 19开始,新申请的bitmap大小必须小于或者等于已经赋值过的bitmap大小。

    2、新申请的bitmap与旧的bitmap必须有相同的解码格式,例如大家都是8888的,如果前面的bitmap是8888,那么就不能支持4444与565格式的bitmap了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
226 4
|
3月前
|
算法 数据处理 Android开发
掌握安卓性能优化的秘诀:电池寿命与运行效率的提升
【10月更文挑战第6天】 本文深入探讨了安卓应用开发中的性能优化技巧,重点分析了影响电池寿命和运行效率的关键因素,并提供了针对性的优化策略。通过代码优化、资源管理、后台任务处理等方法,开发者可以显著提升应用的续航能力和流畅度。同时,结合具体案例,展示了如何在实际开发中应用这些技巧,确保应用在各种场景下都能保持高效运行。本文旨在为安卓开发者提供实用的性能优化指导,助力其打造更优质的应用体验。
79 2
|
1月前
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
65 1
|
2月前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
2月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
46 5
|
2月前
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
74 3
|
4月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
82 20
Android经典面试题之图片Bitmap怎么做优化
|
3月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
77 4
|
3月前
|
存储 缓存 网络协议
5个Android性能优化相关的深度面试题
本文涵盖五个Android面试题及其解答,包括优化应用启动速度、内存泄漏的检测与解决、UI渲染性能优化、减少内存抖动和内存溢出、优化网络请求性能。每个问题都提供了详细的解答和示例代码。
50 2
|
3月前
|
监控 测试技术 Android开发
掌握安卓性能优化的关键策略
【10月更文挑战第7天】 在移动应用开发领域,性能优化是一项至关重要的任务。本文将探讨安卓应用性能优化的重要性、关键策略以及实际操作建议,帮助开发者提升应用的用户体验和竞争力。通过深入浅出的方式,我们将从背景介绍到具体实践,全面解析安卓性能优化的各个维度。