Android中内存优化
- 格式:docx
- 大小:643.38 KB
- 文档页数:10
Android应用内存优化与性能调优技巧第一章:内存管理基础Android应用内存管理是确保应用平稳运行的重要环节,开发者需要了解内存管理的基础知识,以便进行有效的优化和调优。
在本章中,我们将介绍Android应用的内存管理原理、内存泄漏和内存溢出的区别以及常见的内存优化工具和技巧。
1.1 Android应用内存管理原理在Android应用中,每个应用都有一定的内存限制,称为最大堆(Max Heap)。
Android系统通过垃圾回收机制(GC)来回收未使用的内存,使其可供其他应用或系统使用。
内存管理器(Memory Manager)会根据应用的内存需求,动态分配和回收内存。
1.2 内存泄漏与内存溢出的区别内存泄漏(Memory Leak)和内存溢出(Memory Overflow)是常见的内存问题。
内存泄漏是指应用持有某些资源的引用,但无法释放这些资源,导致内存的持续增长。
内存溢出是指应用所需的内存超出了系统分配的内存限制,导致应用崩溃或系统变慢。
优化内存泄漏和避免内存溢出是提高应用性能的关键。
1.3 常见的内存优化工具和技巧为了帮助开发者有效地进行内存优化,Android提供了一系列的内存优化工具和技巧。
其中包括内存分析工具(如Android Profiler和MAT)、内存优化插件(如LeakCanary和MemoryMonitor)以及一些开发技巧(如使用弱引用和使用集合类的优化)。
第二章:内存优化技巧本章将介绍一些实用的内存优化技巧,帮助开发者减少内存消耗、降低应用占用内存的风险,提高应用的性能和响应速度。
2.1 减少内存消耗的技巧在开发应用时,可以采取以下技巧来减少内存消耗:- 使用资源引用(Resource References)来引用大型资源,减少内存占用;- 优化图像资源的大小和压缩方式,减少内存占用;- 使用懒加载(Lazy Loading)来延迟加载大型资源,减少应用启动时的内存占用。
android底层试题答案一、填空题1. Android系统的底层是基于________内核的,它是一种开源的操作系统。
答案:Linux2. 在Android中,所有的应用都是通过________运行时环境来执行的。
答案:Dalvik3. Android四大组件包括:活动(Activity)、广播接收器(BroadcastReceiver)、服务(Service)和________。
答案:内容提供者(ContentProvider)4. Android中使用________来描述用户界面的布局。
答案:XML5. 在Android应用开发中,使用________可以管理应用程序的生命周期。
答案:LifecycleOwner二、选择题1. Android中用于后台长期运行的任务应该使用哪种服务?A. 启动服务B. 绑定服务C. 系统服务D. 异步服务答案:D2. 下列哪个文件是Android工程的配置文件?A. build.gradleB. AndroidManifest.xmlC. MainActivity.javaD. strings.xml答案:B3. 在Android中,用于处理并发操作的是哪一部分?A. 主线程B. 渲染线程C. Java线程池D. JNI层答案:C4. 以下哪个是Android中用于版本控制的命令行工具?A. SDK ManagerB. AVD ManagerC. GitD. Gradle答案:C5. 在Android应用中,如何获取当前设备的屏幕宽度?A. getResources().getDisplayMetrics().widthPixelsB. getWindowManager().getDefaultDisplay().getWidth()C. View.MeasureSpec.getSize(getWidth())D. Configuration.screenWidthDp答案:B三、简答题1. 请简述Android中的沙箱机制。
Android测试如何进行内存和性能优化Android应用程序的内存和性能优化是保证应用程序正常运行和提高用户体验的重要步骤。
本文将探讨Android测试的一些方法和工具,以帮助开发人员进行内存和性能优化。
一、内存优化测试1. 内存泄漏测试内存泄漏是指应用程序在不再使用一些对象时,没有正确释放它们所占用的内存。
通过以下步骤进行内存泄漏测试:- 使用Android的内存分析工具,如Android Profiler,检测内存泄漏问题。
- 使用内存监控工具,如LeakCanary,检测对象的生命周期是否正确管理。
2. 内存占用测试测试应用程序在不同场景下的内存占用情况,以便及时发现和解决内存问题。
可以使用以下方法进行测试:- 使用Android Profiler等工具,监测应用程序的内存占用情况。
- 测试不同设备上应用程序的内存占用情况,以确保应用程序在各种设备上都能正常运行。
二、性能优化测试1. 响应时间测试测试应用程序的响应时间,以确保用户在使用应用程序时能够得到良好的体验。
以下是一些测试方法:- 使用性能测试工具,如JMeter,对应用程序进行负载测试,模拟多用户同时访问应用程序的情况,以评估应用程序的响应速度。
- 测试应用程序在不同网络条件下的响应时间,以确保应用程序在各种网络环境下都能提供良好的用户体验。
2. CPU利用率测试测试应用程序的CPU利用率,以评估应用程序的性能。
以下是一些测试方法:- 使用性能测试工具,如MonkeyRunner,对应用程序进行压力测试,模拟大量用户同时操作应用程序,以评估应用程序的CPU利用率。
- 测试应用程序在不同设备上的CPU利用率,以确保应用程序在各种设备上都能正常运行。
3. 界面渲染性能测试测试应用程序的界面渲染性能,以确保应用程序的界面能够流畅地显示。
以下是一些测试方法:- 使用UI性能测试工具,如UI Automator,对应用程序的界面进行性能测试,评估界面渲染的速度和流畅度。
移动应用性能优化技巧移动应用已经成为现代人生活的重要一部分,越来越多的人离不开手机上的各种应用。
然而,应用的性能问题也是最让人头痛的,比如应用崩溃、卡顿、耗电等。
面对这些问题,我们需要掌握一些移动应用性能优化的技巧,以确保应用能够稳定流畅地运行。
一、减少网络请求网络请求是应用性能消耗的主要来源之一,因此在开发移动应用时,需要尽量减少网络请求的频率和数据量。
可以通过以下方式来减少网络请求:1. 缓存数据:将应用中经常使用的数据缓存在本地,以避免频繁的网络请求。
可以使用 Android 中的 SharedPreferences 或者 iOS 中的 NSUserDefaults 来进行数据存储。
2. 压缩数据:为了减少数据传输的大小,可以使用压缩算法对数据进行压缩。
Android 中可以使用 GZIP,iOS 中可以使用 zlib。
3. 使用 CDN:将应用的资源存储在 CDN 上,减少网络请求的延迟和带宽消耗。
二、优化布局应用的布局对性能也有重要影响。
布局不当可能会导致应用卡顿、界面闪烁等问题。
以下是一些优化布局的技巧:1. 使用约束布局:约束布局是一种弹性布局,能够自适应各种屏幕大小。
相对布局和线性布局是比较传统的布局方式,适用性较差。
2. 避免过度嵌套:过度嵌套会导致布局复杂、渲染时间长、占用内存大等问题。
需要尽量减少布局的嵌套深度,以提高渲染性能。
3. 使用视图重用:对于重复出现的视图,可以使用视图重用技术,以减少视图的创建和销毁次数,优化内存和性能。
三、优化图片图片是移动应用中常见的资源,但过度使用图片会导致应用运行缓慢、卡顿等问题。
以下是一些优化图片的技巧:1. 使用适当的图片格式:不同的图片格式对设备的处理性能和内存占用不同。
比如 JPEG 格式适合处理照片,PNG 格式适合处理图标和小图。
2. 压缩图片大小:使用图片压缩算法对图片进行压缩,以减少图片文件大小,提高下载速度。
3. 使用适当的图片分辨率:对于不同的设备使用不同的分辨率,以提高图片的渲染效果和性能。
•一、App启动速度优化•二、App内存优化•三、App绘制优化•四、App瘦身•五、APP电量优化App启动速度优化一、认识启动加速含义从点击图标到用户可操作的全部过程意义避免用户一安装应用就卸载分类•冷启动•热启动•温启动过程冷启动前•1、点击相应应用图标•2、App启动之后立即展示一个空白的Window(预览窗口显示)•3、创建App进程冷启动后•1、创建App对象•2、启动Main Thread•3、创建启动的Activity对象,闪屏显示•4、创建启动的MainActivity对象,主页显示•5、其它工作二、优化工具力求获取准确的数据评估1、TraceView性能损耗太大,得出的结果并不真实作用:主要做热点分析,得到两种数据•单次执行最耗时的方法•执行次数最多的方法使用:•1、代码中添加:Debug.startMethodTracing()、检测方法、Debug.stopMethodTracing()•2、打开Profile->CPU->点击Record->点击Stop->查看Profile下方Top Down/Bottom Up找出耗时的热点方法。
2、Systrace+函数插桩Systrace原理在系统的一些关键链路(如SystemServcie、虚拟机、Binder驱动)插入一些信息(Label),通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息,最后得到整个系统的运行性能信息。
Android Framework里面一些重要的模块都插入了label信息(Java 层通过android.os.Trace类完成, native层通过ATrace宏完成),用户App中可以添加自定义的Lable。
特性•系统版本越高,Android Framework中添加的系统可用Label就越多,能够支持和分析的系统模块也就越多。
十条Android系统优化技巧让安卓手机反应更流畅安卓手机作为当前最为广泛使用的智能手机操作系统,由于其开放性和自定义性受到了广大用户的喜爱。
然而,随着手机使用时间的增长,用户可能会发现手机反应速度变慢,卡顿现象频繁发生。
为了帮助用户优化安卓系统,本文将介绍十条Android系统优化技巧,帮助您的安卓手机保持流畅。
1. 清理缓存:安卓手机在使用过程中会产生大量的缓存文件,这些文件会占用存储空间并降低系统运行速度。
通过定期清理缓存,可以释放存储空间并提升手机反应速度。
进入手机设置-存储-缓存,清理缓存文件即可。
2. 关闭后台应用:安卓系统允许多个应用同时在后台运行,这会消耗手机的内存和处理器资源。
通过关闭不需要的后台应用,可以释放资源,提高系统反应速度。
长按多任务键或使用系统内存清理工具,选择关闭后台应用。
3. 禁用无用应用:安卓手机出厂时会预装一些应用程序,而用户并不一定需要或使用这些应用。
这些无用应用会占用系统资源,降低系统运行速度。
进入手机设置-应用管理,找到无用应用并选择禁用。
4. 优化动画效果:安卓系统默认开启了一些动画效果,如窗口动画和过渡动画。
这些动画效果会增加系统响应的延迟时间,可通过减少动画时间或关闭动画效果来提高系统反应速度。
进入手机设置-开发者选项,调整动画缩放比例或关闭动画效果。
5. 更新系统和应用:安卓系统和应用程序的更新通常会带来性能优化和bug修复。
确保你的系统和应用程序始终是最新版本,可以提升系统稳定性和反应速度。
进入手机设置-关于手机-系统更新,检查更新并按照提示进行更新。
6. 使用轻量级应用:一些应用程序在功能上虽然强大,但也常常伴随着高资源消耗。
选择使用轻量级应用,可以减少系统负担,提升系统反应速度。
在应用商店中搜索类似的轻量级应用,并替换原有应用。
7. 谨慎使用小部件:安卓手机上的小部件可以提供便捷的信息展示,但同时也会占用系统资源。
过多使用小部件会影响系统反应速度,建议在实际需要的情况下使用小部件,并及时清理不需要的小部件。
解析Android测试中的卡顿问题在Android应用开发过程中,卡顿问题是开发者经常面临的挑战之一。
卡顿可能导致用户体验下降,应用性能受损。
因此,解决Android 测试中的卡顿问题至关重要。
本文将对Android测试中的卡顿问题进行解析,并提供一些解决方案。
一、了解卡顿问题的原因卡顿问题通常是由以下原因导致的:1. 主线程阻塞:在Android应用中,主线程用于处理用户界面相关的操作。
如果主线程被繁重的任务阻塞,如网络请求、复杂计算等,就会导致应用的界面无法及时响应用户操作,从而出现卡顿现象。
2. 内存泄漏:内存泄漏是指应用程序中已分配的内存没有被正确释放的情况。
如果应用中存在大量的内存泄漏,会导致系统资源不足,从而引发卡顿问题。
3. UI渲染问题:UI渲染过程中,如果布局复杂、嵌套层次过深或者频繁修改界面等,会导致UI渲染的性能下降,从而引发卡顿问题。
二、检测和分析卡顿问题在解决卡顿问题前,首先需要检测和分析问题所在。
以下是一些常用的工具和技术:1. TraceView:TraceView是Android SDK中提供的一种分析工具,用于跟踪和分析应用程序的性能问题。
通过TraceView,开发者可以查看方法调用的时间及其在UI线程中的占比,从而确定可能导致卡顿的方法。
2. Systrace:Systrace是Android SDK中的另一个强大的分析工具,用于跟踪应用程序的系统性能问题。
通过Systrace,开发者可以查看应用程序的系统调用情况,如CPU使用情况、内存分配状况等,从而找到可能导致卡顿的原因。
3. 布局优化工具:Android Studio提供了一系列的布局优化工具,如布局层次查看器、布局分析器等,用于帮助开发者分析布局文件的复杂度,找到可能导致卡顿的布局问题。
三、解决卡顿问题的方法针对不同的卡顿原因,可以采取不同的解决方案。
以下是几种常见的方法:1. 异步处理:将繁重的任务,如网络请求、复杂计算等,放到子线程中执行,避免阻塞主线程的执行。
优化Android应用的内存占用测试与调优移动应用在Android平台上的开发与优化是一个关键的环节,其中内存占用是开发者需要重点关注的问题之一。
本文将介绍如何进行Android应用的内存占用测试与优化,以提升应用的性能和用户体验。
一、内存占用测试的重要性在开发Android应用时,合理管理内存占用是保证应用性能和稳定性的关键。
过高的内存占用将导致应用运行缓慢、卡顿,甚至崩溃。
内存占用测试的目的是发现和解决内存泄漏、过多的对象创建等问题,以确保应用在各种设备上都能正常运行。
二、内存占用测试方法1. 使用Android Profiler进行实时监测:Android Studio提供了Android Profiler工具,可以实时监测应用的内存占用情况。
开发者可以使用该工具来查看应用的内存分配情况、堆内存的使用情况等。
通过监测内存占用的变化,可以发现潜在的内存问题并进行优化。
2. 运行内存分析工具:Android平台上有许多内存分析工具可供使用,例如MAT(Memory Analyzer Tool)、LeakCanary等。
这些工具可以帮助开发者分析应用的内存占用情况,找出内存泄漏和过多对象创建等问题。
通过分析工具提供的报告和数据,开发者可以有针对性地对应用进行调优。
三、内存占用优化的方法1. 减少对内存的依赖:开发者在设计应用时,应尽量减少对内存的依赖,避免过多的对象创建和内存占用。
可以使用一些轻量级的数据结构和算法来代替占用较大内存的对象,如使用SparseArray代替HashMap,使用ArrayList代替LinkedList等。
2. 及时释放不再使用的资源:在Android开发中,需要及时释放不再使用的资源,以避免内存泄漏。
例如,在Activity或Fragment销毁时,需要及时释放相关的资源,如取消注册的监听器、关闭数据库连接等。
此外,对于大文件的读写操作,也需要及时关闭相关的流。
3. 使用图片资源的优化:图像资源是Android应用中常见的内存消耗较大的部分。
android高级工程师面试题在Android平台上,高级工程师的技术要求较为严苛,需要具备深厚的编程基础和丰富的项目经验。
下面是一些常见的Android高级工程师面试题,以供参考。
1. 请简要介绍一下Activity的生命周期及其对应的回调方法。
Activity是Android应用程序的核心组件之一,它具有生命周期,包括以下方法:- onCreate():当Activity被创建时调用,主要用于进行初始化操作。
- onStart():当Activity即将变为可见状态时调用。
- onResume():当Activity获得焦点并开始活动时调用。
- onPause():当Activity失去焦点但仍然可见时调用,通常用于保存数据或停止动画等操作。
- onStop():当Activity不再可见时调用,可以在此方法中释放资源。
- onDestroy():当Activity被销毁时调用,用于释放占用的资源。
2. 请解释一下Android中的四大组件。
Android中的四大组件是指Activity、Service、Broadcast Receiver和Content Provider。
- Activity:用于提供用户界面,用户可以与之进行交互。
- Service:在后台执行长时间运行的任务,与Activity无交互。
- Broadcast Receiver:监听系统广播,响应特定的广播消息。
- Content Provider:用于不同应用程序之间共享数据,提供对数据的增删改查操作。
3. 请介绍一下Android中的线程间通信方式。
Android中实现线程间通信的方式有多种,包括:- Handler:通过发送消息和处理消息来实现线程间通信。
- runOnUiThread():在主线程中更新UI。
- AsyncTask:用于在后台执行耗时操作,并在主线程更新UI。
- BroadcastReceiver:通过广播机制实现跨组件的通信。
安卓手机内存空间越来越小了怎么办在有些时候我们的安卓手机内存空间越来越小,这该怎么办呢?下面就由店铺来为你们简单的介绍安卓手机内存空间越来越小的解决方法吧!希望你们喜欢!安卓手机内存空间越来越小的解决方法:1、存储内存的清理:由于软件会缓存很多文件占用内存,卸载后的残留文件我们可以用一款叫做“猎豹清理大师”(原金山清理大师)的软件对垃圾文件进行清理。
2、运行内存的清理:可以长按Home键,调出近期任务列表,关闭不需要的程序,释放一定的内存空间。
在内存严重不足的情况下,可以尝试破解系统最高权限,卸载不需要的内置软件。
3、一般内存手机运行内存低于1G就会出现明显的卡顿,所以选购手机最好挑选2G以上的手机。
其次:ROOT手机,ROOT你的手机,ROOT后,你能够获得手机的最高权限,同时你能够管理系统内置的软件,找出这些不必要的,经常在你后台运行的软件,这样你就能省下很多运存空间。
不安装安全软件,尽量不要使用安全软件,很多人都会给自己的手机上安装一个某某安全卫士,其实这些安全软件是最占运存的,但是不用安全软件,手机不就不安全了吗?大家可以在手机上安装一个优化软件,比如安卓优化大师,这类软件占用的运存不会很大,同时这类软件会自带安全防护功能,放骚扰之类的功能还是具备的,同时它还有垃圾清理的功能。
刷机,刷机也可以让自己的手机变得很流畅,大家可以根据自己的需要,找一找自己手机的简化包进行刷机。
PS:刷机有风险,刷机需谨慎。
不做“升级狂人”,手机软件不一定要升级,很多“升级狂人”总会在软件一更新的时候就马上升级,但是有时候不一定要升级软件,有时候升级后的软件会变得非常占用运存,这点大家要注意。
还有一个小技巧,大家手机都会安装一些第三方的输入法,这些输入法其实也是最占用运存的软件之一,大家可以使用这些输入法的历史版本,也就是旧版本,这些旧版本的输入法占用运存其实不是很大。
虚拟内存,很多手机都可以开虚拟内存,但其实效果都不是很理想,同时这种方法很伤内存卡,不建议使用。
Android中内存优化的那些事一个有关图片的优化记录
客服群里叫喊着:这个用户图片不显示了,那个用户图片也不显示了。
我拿着手上一切正常的测试机,what the hell……
默默地打开bugly。
满园春色关不住,遍地内存溢出来!是的,又闯祸了!
内存问题永远是既陌生又熟悉的话题,而且大多数都发生在一个叫作用户家的手机上。
安卓系统本身不断的在优化,三方框架也逐渐成熟,外加手机厂商的大内存加持,似乎内存问题变得少见,但还是不能忽视。
借着这次修复内存问题的记录,分享一些“自以为”的解决思路,仅供参考。
ok,let’s go!
修复问题的三部曲,先复现,再定位,最后修复。
复现
估计有的人会说,异常现象都在那,有啥好复现的,冲进代码直接开干。
修复bug永远是个惊心动魄的事,稍微一不小心就有可能天崩地裂。
不是修复不完全,就是引入新问题。
从起因开始了解整个缘由,一方面能加深对问题的理解,同时确保最终能验证问题是否得到修复。
内存的问题经常发生在一些比较特殊的环境下,而且很多时候不一定是必现,往往体现在一些中低端机型上。
所以从机型上入手可能会是一个不错的选择。
最终,通过bugly查到了对应的问题机型及系统版本,上各类云测平台找到了台云测试机。
按照进入问题页面的几个固定流程,反复执行,最终锁定了复现流程。
定位
知道问题如何复现,接下来就是定位问题到底出在哪。
通常内存的问题,会碰到两种情况:
1.内存堆积:由于特殊情况造成的页面关闭但资源还遗漏在内存中。
2.内存高占用:由于业务需要或者使用不当导致内存占用量过高。
我们先来看看这次的问题属于哪种情况。
在Android Studio2.3及之前版本上自带的Android monitor中,可以直观的反应出当前应用的整体内存使用水平。
[如何使用工具的分享估计大家都看腻了,这次就不再重复了。
142MB!!!!进入事故现场之前就已经被占用了这么多内存。
难怪之后会内存异常。
看来这次要先解决内存高占用的问题,我们先要详细的了解内存的具体情况,才知道从哪下手去解决,无论是避免无意义的使用或者优化必要的占用。
先强制gc一下,然后dump java heap,看一下整体内存里的情况,按照shallow size排序。
首当其冲的byte数组映入眼帘,大家都明白的,bitmap一直都是大客户。
我们接着分析下byte[]中的各个对象。
从数据上看,有很多大小相同的内存使用,从理论上看应该是有很多尺寸相同的图片。
可为什么会有这么多呢?是相同的图片重复了?or other?
所谓耳听为虚眼见为实,如果能看到这些图片长什么样,是否就容易做出对应的判断了?来,开始行动:
来自Gracker的Android内存优化之三:打开MAT中的Bitmap原图| Performance。
感谢Gracker的分享,Get到一个新技能。
具体流程参见传送门。
主体思路就是通过MAT将对应的byte数组另存为图片原始文件,再用对应的工具打开预览即可。
不过我记得以前Android Studio是可以直接看的,可现在不知道跑哪了。
步骤一:
因为Android Studio dump出来的文件mat是无法直接打开的,所以需要做一次转换。
在Captures中找到刚刚dump出来的prof文件。
右键-> Export to standar .hprof 即可。
步骤二:
通过MAT Eclipse Memory Analyzer Open Source Project 打开。
步骤三:
右键想要查看的对象-> Copy -> Save Value To File。
保存为xxx.data。
他推荐使用Gracker分享中的gimp。
Photoshop不确定是不是我使用方式有问题,在验证的时候一直无法正常显示。
步骤四:
查看对应图片的相关属性,主体是要宽高,因为上一步中保存的是图片的原始格式文件,其中不包含对应的参数信息,所以在导入gimp中需要指定对应的参数。
步骤五:
打开gimp GIMP - Downloads. 然后打开刚刚导出的问题。
图像类型根据实际的来,一般都是8888或者565,选择RGB Alpha或者RGB565。
然后宽度与高度填写刚刚查询到的参数。
最后点击open就能看到实际的图片。
通过这个方式,可以直观的查看到内存中图片的实际情况。
然后我们就可以进一步分析产生问题的实际原因。
通过以上方式,定位到了3个问题:
1.有大量图片资源占用,首页确实有好多图。
2.有暂未使用到的图片资源占用(gone状态)。
3.有大量蒙版图片占用,因为设计师要求的效果。
解决- 大量图片占用
对于大量图片占用的问题,其实从以下几个个方向来看思考问题。
1.从效果设计的角度来避免,尽可能的少使用满屏图片的方式来处理需求。
但这方面我个人主张尊重设计师,专业的事情交给专业的人去处
理。
2.图片资源本身,在满足效果的前提下,尽可能的选用RGB565,也许少量图片不明显,但在量大的情况下,节省的内存资源还是很客观。
3.图片资源在不使用的时候及时释放。
结合以上方向来看下我们遇到的问题。
设计角度目前无法调整,缘由都是泪,这里就不多说了。
资源本身已经是RGB565。
图片的释放应该是fresco 的强项,可从现象上看似乎并没有。
看来问题可能出在这,回ui页面上瞄一眼,明白了。
viewpager + fragment + recyclerview,相当于大量图片都属于使用状态,所以fresco不会去释放对应的资源。
临时解决方案:
为了确保核心逻辑的顺利,通过RxBus的方式,在进入和退出核心页面时发送Event事件,然后在大量使用图片的页面注册接收此系列事件,遍历所有SimpleDraweeView,调用其Controller的onDetach或onAttach来,从而实现图片资源引用的临时释放和加载恢复。
为什么是临时解决方案,因为我总觉得是一种取巧的方式,理论上看。
是不应该直接调用方法来插手fresco的管理流程。
所以此处留坑,之后再次深入了解fresco的原理后再回填,也希望大家提些建议或者意见。
解决- 暂未使用到的图片资源占用
每个页面中,都有处理网络异常及相关数据加载异常的提示。
原先的处理方式是通过include统一导入后隐藏,在遇到异常的时候才显示出来。
问题就出在这,这些异常提示本身是小概率触发,但通过include标签导入的话,会直接实例化完成,占用内存资源。
临时解决方案:
改用ViewStub标签,实现按需加载。
为什么又是临时解决方案呢,因为有些机型在黑屏状态下是切断wifi的,当重新进入应用的时候都会经过一个联网的过程,所以会先触发联网异常,ViewStub只能加载一次,加载完后就占用内存了。
解决- 蒙版图片
之前为了在图片上显示文字但又不想被图案所影响,所以在上面加一层阴影蒙版来保证字体的显示效果。
习惯用fresco:overlayImage的方法来实现。
但这种实现方式会造成蒙版本身是一个独立的内存资源。
解决方法:
尝试通过Processor的方式,预先把蒙版与要显示的图片合成,使得在内存中只保留一份资源。
结果
通过以上优化方式,同样的机型再次检测,内存占用下来了....
总结
这次从内存高占用入手,解决了由于内存使用量过高导致的内存溢出。
等之后遇到内存遗留问题时,再来补下文。
内存问题的排查与解决算是一个老生常谈的话题,因为适配等等情况往往又是一个比较棘手的问题。
开发的时候很难发现,所以建议一个需求完成后都例行的检查下内存状况,看下是否有问题后者需要调整的部分。
【编辑推荐】
1.Android数字跳动的TextView实现
2.Android用Retrofit 2实现多文件上传实战
3.Android O中对设备标识符所做的变更
4.Android自定义控件:类QQ未读消息拖拽效果
5.开源Anbox在Linux中运行Android应用。