在Android开发中,有哪些好的内存优化方式

作者&投稿:成诗 (若有异议请与网页底部的电邮联系)
android开发的方式有哪些~

1,如果你说的内存优化方式的话,在开发中注意局部变量和全部变量的使用频率,降低数据算法的时间复杂度,减少使用多线程,简化UI线程(主线程),资源文件的数量以及大小等等。2,事实上,在android开发出来的程序很容易卡顿(所谓的卡,只是显示时间超过人眼识别时间),所以你应该留意UI设计,在android程序中,使用GPU进行界面绘制,如绘制背景色,背景图片,视图形状,大小等等。但是在使用GPU绘制界面的时候很可能会发生OverDraw(重复绘制),如:你设置一个TextView的背景色为红色,字体为白色,所以GPU得先绘制TextView 的背景色,而后绘制字体色,所以对同一个控件进行了多次绘制,从而使加载界面时出现卡顿。为减少这种情况的发生,必须减少OverDraw的次数,在代码中注意style,background,src,等等的使用。

手机内存分为存储内存和运行内存1、手机内存还有很多,安装软件时为什么总是提示内存不足慢是因为手机内存被占用太多哦。存储内存的清理:由于软件会缓存很多文件占用内存,卸载后的残留文件我们可以用腾讯手机管家对垃圾文件进行清理。2、运行内存的清理:可以长按Home键,调出近期任务列表,用腾讯手机管家的加速小火箭关闭不需要的程序,释放大量的存储空间、管理手机不必要的进程、自动加快系统的运行速度、提高CPU的运转,全面提升手机的使用性能。3、在内存严重不足的情况下,可以尝试破解系统最高权限,卸载不需要的内置软件。一般内存手机运行内存低于1G就会出现明显的卡顿,所以选购手机最好挑选2G以上的手机。

内存优化
Coding
Bitmap
ListView
SoftReference & WeakReference
UI

2.1 Coding
Tip 1:使用优化过的数据容器。
如SparseArray,SparseBooleanArray,LongSparseArray,代替HashMap
前提:Key为Integer类型
原因:
HashMap 是内存低效的,因为每一个mapping都需要单独的entry(如下图)。
每个元素多占用8byte内存(多了next和hash两个成员变量)。AutoBox【int转Integer,导致产生另一个对象】也会额外加4byte。Entry对象本身至少16byte。
SparseArray可以避免AutoBox,查找方法为二分查找,效率比HashMap低一些,但百量级以内性能差距不大。

HashMap<Integer, E> hashMap = new HashMap<Integer, E>();
替换为
SparseArray<E> sparseArray = new SparseArray<E>();、
Tip 2:使用IntentService替代Service。
IntentService优势:
•新开线程;
•顺序处理Intent;
•执行完自动退出。
说明:
Service是一个没有界面的服务,但其实它不是后台的,所有的代码默认在UI线程执行。若要执行耗时操作,需要新开线程或者使用AsyncTask。
IntentService继承自Service,所以它也是一个服务。
IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程。
IntentService与Service区别:
1,Service默认在UI线程执行;而IntentService的onHandleIntent方法在后台执行。
2,Service在start后,如果没有手动stop会一直存在;而IntentService在执行完后自动退出。
Tip 3:尽量避免使用Enum。
枚举相对于静态常量来说,需要两倍甚至更多的内存。如下是Enum的类型定义:

Tip 4:使用混淆器移除不必要的代码。
ProGuard工具通过移除无用代码,使用语意模糊来保留类,字段和方法来压缩,优化和混淆代码。可以使你的代码更加完整,更少的RAM 映射页。
Tip 5:尽量不要因一两个特性而使用大体积类库。
Tip 6:频繁修改时使用 StringBuffer(Thread-Safe)或 StringBuilder(Thread-Unsafe)。
使用String修改字符串时,若修改后字符串在字符串常量区不存在,便会新生成一个String对象。
Tip 7: 对于常量,请尽量使用static final。
如果使用final定义常量之后,会减少编译器在类生成时初始化<clinit>方法调用时对常量的存储,对于int型常量,将会直接使用其数值来进行替换,而对于String对象将会使用相对廉价的“string constant”指令来替换字段查找表。虽然这个方法并不完全对所有类型都有效,但是,将常量声明为static final绝对是一个好的做法。
Tip 8:对象不用时最好显式置为Null。
对象不用时最好显式置为Null可以减少GC开销。
警惕:静态变量引起内存泄露

这段代码中有一个静态的Resources对象。代码片段mResources = this.getResources()对Resources对象进行了初始化。这时Resources对象拥有了当前Activity对象的引用,Activity又引用了整个页面中所有的对象。
如果当前的Activity被重新创建(比如横竖屏切换,默认情况下整个Activity会被重新创建),由于Resources引用了第一次创建的Activity,就会导致第一次创建的Activity不能被垃圾回收器回收,从而导致第一次创建的Activity中的所有对象都不能被回收。这个时候,一部分内存就浪费掉了。
警惕:使用Activity Context引起内存泄露。
应该尽量使用Application Context。
在Android中,Application Context的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期。如果想保持一个长期生命的对象,并且这个对象需要一个Context,就可以使用Application对象。
看使用的周期是否在activity周期内,如果超出,必须用application;常见的情景包括:AsyncTask,Thread,第三方库初始化等等。
还有些情景,只能用activity:比如,对话框,各种View,需要startActivity的等。总之,尽可能使用Application。

上面由于静态变量导致的内存泄露问题,可以修改如下:

2.2 Bitmap
Tip:捕获异常

因为Bitmap是吃内存大户,为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常以后Crash掉,需要特别注意实例化Bitmap部分的代码。通常,在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获。
OutOfMemoryError是一种Error,而不是Exception。
Tip:缓存通用的图像【该方法测试无效】
应用场景:默认头像。有时候,可能需要在一个Activity里多次用到同一张图片。比如一个Activity会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。
此方法无效!因为:
因为Android自带资源文件缓存机制:
在Resource.java类中有LongSparseArray<WeakReference<Drawable.ConstantState> > mDrawableCache
每次会new 一个Drawable,但内部bitmap还是指向cache中的。
Tip:压缩图片
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
如果图片像素过大,使用BitmapFactory类的方法实例化Bitmap的过程中,就会发生OutOfMemory异常。
使用BitmapFactory.Options设置inSampleSize就可以缩小图片。属性值inSampleSize表示缩略图大小为原始图片大小的几分之一。即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片的大小就为原始大小的1/4。
如果知道图片的像素过大,就可以对其进行缩小。那么如何才知道图片过大呢?
使用BitmapFactory.Options设置inJustDecodeBounds为true后,再使用decodeFile()等方法,并不会真正的分配空间,即解码出来的Bitmap为null,但是可计算出原始图片的宽度和高度,即options.outWidth和options.outHeight。通过这两个值,就可以知道图片是否过大了。

先获取图片真实的宽度和高度,然后判断是否需要跑缩小。如果不需要缩小,设置inSampleSize的值为1。如果需要缩小,则动态计算并设置inSampleSize的值,对图片进行缩小。
Tip:及时回收Bitmap的内存 (≤Android 2.3.3,API10)

Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap对象,只能通过BitmapFactory类的各种静态方法来实例化一个Bitmap。
仔细查看BitmapFactory的源代码可以看到,生成Bitmap对象最终都是通过JNI调用方式实现的。所以,加载Bitmap到内存里以后,是包含两部分内存区域的。简单的说,一部分是Java部分的,一部分是C部分的。这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了,但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用recycle()方法来释放C部分的内存。从Bitmap类的源代码也可以看到,recycle()方法里也的确是调用了JNI方法了的。
2.3 ListView
Tip:从ContentView获取缓存的view

如果不使用缓存convertView的话,调用getView时每次都会重新创建View,这样之前的View可能还没有销毁,加之不断的新建View势必会造成内存泄露。
Tip:使用ViewHolder模式来避免没有必要的调用findViewById()

ViewHolder模式通过getView()方法返回的视图的标签(Tag)中存储一个数据结构,这个数据结构包含了指向我们要绑定数据的视图的引用,从而避免每次调用getView()的时候调用findViewById()。
2.4 SoftReference & WeakReference

软引用

只有当内存空间不足了,才会回收这些对象的内存。

软引用可用来实现内存敏感的高速缓存。

Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
弱引用

被垃圾回收器扫描到后即被回收。

Map<String,WeakReference<Bitmap>> cacheMap = new HashMap<String, WeakReference<Bitmap>>();

只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有 弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对 象。

案例:异步加载网络图片

详见:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0920/1554.html
2.5 UI
Tip 1:利用系统资源
系统定义的id:如@android:id/list
系统的图片资源:如@*android:drawable/ic_menu_attachment
系统的文字串资源:如@android:string/yes
系统的Style:如android:textAppearance="?android:attr/textAppearanceMedium“
系统的颜色定义:如android:background ="@android:color/transparent"

说明:
Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小。
Android中没有公开的资源,在xml中直接引用会报错。除了去找到对应资源并拷贝到我们自己的应用目录下使用以外,我们还可以将引用“@android”改成“@*android”解决。
Tip 2:通用模块抽离
<include layout="@layout/navigator_bar" />
背景
头部标题栏
底部导航栏
ListView
Tip 3:ViewStub
ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。

Android开发内存优化方式:
1、图片的优化:通常在Android平台中2维图像处理库BitmapFactory做的比较智能,为了减少文件体积和效率,常常不用很多资源文件,而把很多小图片放在一个图片中,有切片的方式来完成,在J2ME中这样是为了将少文件头而解决MIDP这些设备的问题,而Android中虽然机型硬件配置都比较高,有关Android G1硬件配置可以参考G1手机参数以及评测,但是当资源多时这样的运行效率还是令人满意的,至少Dalvik优化的还不是很够。
2、Java内存控制:针对字符串操作而言如果需要连加这样的操作建议使用StringBuilder,经过调试不难发现如果字符串每次连加,使用String需要的内存开销会远大于StringBuilder,然后Android手机常规的运行内存大约在128MB左右,对于运行多任务就需要考虑了,Android开发网提示因为Java有GC不需要手动释放那么分配的时候就要格外的小心,频繁的GC操作仍然是很影响性能的,在调试时可以通过logcat查看内存释放情况。
3、循环使用:一般在访问一个属性的时候效率远比一个固定变量低,如果循环估计次数常常大于5,假设xxx.GetLength()方法的值一般大于5,推荐这样写,比如 for(int i=0;i<xxx.GetLength();i++) 这里xxx.GetLength在每次循环都要调用,必然会影响程序效率,在游戏开发中显得更为明显,改进的方法应该为 int j=xxx.GetLength() for(int i=0;i<j;i++)

  我的做法是时间换空间,尽量文件化一些占用内存的数据。最典型的就是ListView中的Bitmap,可以参考这个开源组件的实现。 其将Bitmap都本地文件缓存,内存中只保留最近使用的4张图片,在使用中发现还是会偶尔出现OOM,然后我就将其改为完全的读取文件,内存中不保留图片,使用以后都自动回收,由此扩展的数据文件也同样缓存成文件。

  除了Bitmap,其他的地方没想到什么能占用这么大内存,网络下载下来的数据文件?需要都留在内存中吗?目前我做的应用,每次请求的数据大小都比较小,每次Http请求下来的数据都把url转换成文件名,然后缓存成文件,在下次Http请求的时候先根据url来预读文件,暂时不用的数据就释放掉。

  经常会OOM我觉得就是在Bitmap处理的时候,比如decodeFile,在往界面上加载图片时,不用直接加载原图,可以进行缩放。一张1000*1000的图片要加载到一个100*100的ImageView上,直接加载进来大多数都会OOM,可以先用inJustDecodeBounds
  BitmapFactory.Options options = new BitmapFactory.Options();
  options.inJustDecodeBounds = true;
  拿到这个图片的大小,再算好缩放比例
  int scale = 0;
  scale = (int)(options.outHeight / (float)size);
  if (scale <= 0) {
  scale = 1;
  }
  options.inSampleSize = scale;
  options.inJustDecodeBounds = false;
  再进行decode。

  总之就是尽量时间换空间,实际这个时间是非常非常短的,用户体验内的。

为数据加载设置三级缓存。etg:将加载的数据(图片等)存入RAM(如:HashMap)中,并存入本地内存。当用户开启需要加载的界面使,先从RAM获取数据,如果RAM没有,则访问本地获取,若本地有则将本地数据存入RAM再重新执行从RAM获取数据,若本地没有,则访问服务器获取数据,同理传递数据到RAM让数据显示出来。


Androidapp开发搭建服务器(Android服务器端搭建)
9.与Android应用程序集成:在Android应用程序中使用HTTP请求或其他通信协议与服务器进行通信。使用Android开发工具集成服务器端API,确保Android应用程序可以正确地与服务器端进行数据交互。10.监控和维护:设置监控和日志系统,以便能够追踪服务器性能和问题。定期维护服务器,确保安全性和性能。以上步骤是一个...

怎么学android手机开发?
怎么学android手机开发,说到Android,相信你都知道,至于怎么学?昌平镇北大青鸟专业老师告诉你:android手机开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。那么Java学到什么程度才算是过关呢?java课程认为至少要掌握以下两个方面的内容:1、Java基础...

android开发有哪些技术
Android开发涉及的技术主要包括:Java或Kotlin编程语言、Android SDK、UI开发技术、数据库技术、网络编程技术以及其他辅助技术。Java或Kotlin编程语言是Android开发的基础。Android系统主要基于Java语言进行开发,随着版本的迭代,Kotlin也逐渐成为官方推荐的开发语言。开发者需要使用这些语言进行应用程序的逻辑编写。An...

android开发是什么意思?
Android开发指的是针对Android操作系统进行应用程序的开发,主要使用Java语言。移动设备已经成为人们生产和生活的重要工具,而Android系统的普及使得Android应用的开发成为了当前非常热门的技术领域。通过Android开发,可以实现各种各样的功能和特性,例如响应用户操作、与网络进行交互、调用设备的传感器、与第三方服务...

android嵌入式开发的特点是什么
2.多样化的硬件支持:Android支持多种硬件架构和设备类型,从手机和平板电脑到智能电视、车载系统等,适用范围广泛。这使得Android嵌入式系统可以用于各种嵌入式应用场景。3.应用生态系统:Android拥有丰富的应用生态系统,开发者可以利用丰富的开发工具和应用程序接口(API)来构建功能强大的应用。这降低了开发...

开发AndroidAPP使用的是什么语言?
2. Java语言在设计时借鉴了C++的特点,但更加易于学习和使用。它完全采用对象导向的编程范式。3. 使用Java编写的应用程序可以在单机或网络环境中的服务器和客户端上运行。4. Java还可以用来开发小程序或applet,这些程序可以嵌入网页中,使用户与网页之间能够进行交互。5. 除了Java,Android开发也可以使用C...

手机androidapp开发并是嵌入式开发吗
是的,手机AndroidApp开发可以被视为嵌入式开发的一种形式。AndroidApp开发涉及创建在Android操作系统上运行的应用程序。Android是一种基于Linux内核的开源操作系统,主要用于移动设备,如智能手机和平板电脑。Android应用程序直接运行在设备硬件之上,并与手机的硬件和操作系统进行交互。嵌入式系统的定义是包含在...

怎样学习Android的开发技术
至于服务和广播组件可以稍微缓一下,到实际使用的时候再学习都可以。2、界面开发技术 界面开发是一种基本的技术,几乎所有的程序里面都需要用到。在Android开发中界面开发分为3种:1)使用xml文件布局 使用xml首先对于界面进行布局,然后在Activity里面进行引用是最常见的应用软件开发技术,这种方式使用的最大...

android开发和java开发有什么区别
android开发和java开发有什么区别 安卓是用Java语言开发的! Java开发有后台有前端,内容就多了。第一、平台不一样。java开发是桌面或者企业级的电脑上执行的,一个是在Android系统上执行的。两者的程式码不能互通。不过都是用java语言写的。 第二、不同系统上的控制元件不同,所以导致两者程式码不...

安卓开发需要学习什么
学习分三个阶段:1,Android基础阶段:平台架构特性(JAVA\/C) Market\/应用程序组件 环境搭建与部署\/打包与发布 AVD\/DDMS\/AAPT 调试与测试 相关资源访问\/资源制作 Activity\/Service\/Broadcast Receiver\/Content Provider\/原理(生命周期)及深层实现 2,Android进阶初级:组件Widget\/ 菜单Menu\/ 布局Layout 详解 ...

纳雍县13362261510: 在Android开发中,有哪些好的内存优化方式 -
蔚庾三七: 可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构.通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作.另外,SparseArray更加高效,在于他们避免了对key与value的自动装箱(...

纳雍县13362261510: Android 开发有什么好的架构么 -
蔚庾三七: Android开发,或者说移动终端开发的入门易就不可避免的精通难.低门槛和低要求导致了J2EE程序猿可能要5年才开始考虑的东西移动开发者甚至1年后就开始感到迷茫,例如架构.不才的本人与题主相仿,也是在毕业写Android几年后开始从如何实现转而思考怎么更好的实现.如何抽象,如何接口,如何实现可扩展.当时去github疯狂的寻找开源工程读源码,但大多找到的也只是“写的很漂亮的代码”而已.移动终端单打独斗的特点也许也注定了代码比起架构更注重完整性和功能性.所以现在对这点看的挺淡的,尽量将代码写的漂亮些,但不过多苛求.也许敏捷的大流行也从一个侧面证明了移动开发不要过多的关注架构

纳雍县13362261510: Android 开发有哪些新技术出现 -
蔚庾三七: 1、开发工具 Android Studio: Google 官方放弃 Eclipse 和 Android Studio 普及.AS 虽然不算新,但是对 Android Studio 这个软件的更新速度快的惊人,有大量的新功能发布.例如支持很多注解代码提示注解、Live code template、支持自动生成...

纳雍县13362261510: android有哪些快速开发应用的开源框架 -
蔚庾三七: ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpclitent的http模块,具有快速...

纳雍县13362261510: 有哪些好的Android开发书籍推荐? -
蔚庾三七: 目前来看国内的一些书籍讲解的不是很好,很多书籍概念错误经历了n个版次,Android巴士推荐看SDK文档,学习SDK中的例子比如 ApiDemos,接着直接看Android系统开源应用的代码,国内很多书大同小异基本上就是骗钱的,如果真想的想购买,建议买国内翻译过来的如果英文足够,直接看英文PDF原版比较好.

纳雍县13362261510: 有什么好的Android快速开发框架?能快速开发一些安卓的小应用的? -
蔚庾三七: 既然都知道这些名字了,那稳不稳定,资料多不多网上一搜不就知道了. 个人经验,快速开发框架有很多是依赖注入框架,例如你百度 “roboguice的用法”,利用反射原理将控件和事件绑定,节省你诸如 findViewById 这样的代码,写起来方便 ,只需要写@ViewInject后边跟上你的控件id就行了; 还有ormlite,一个orm框架,也是反射注入,帮你节省数据库crud的代码,诸如此类.它们的优点: 开发速度快, 缺点: 对性能消耗略大.google官方不甚推荐.其实开发应用所花的时间不是在于这些,主要在逻辑业务代码上.

纳雍县13362261510: Android开发用什么IDE工具 -
蔚庾三七: Android的开发技术很多,在开始学习的时候不可能一次性全部学会,也没有必要一开始都全部学会,但是有些技术是非常常用的,需要在开始时打好基础,这些技术时: 1、Activity生命周期 虽然Android中有四大组件,但是不可否认Activity是...

纳雍县13362261510: 想要自己编辑安卓软件,哪些软件平台好用?? -
蔚庾三七: Eclipse+Android SDK+ADT.Eclipse 是一个开放源代码的、基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java...

纳雍县13362261510: 现在安卓开发用什么软件比较好呢?(最好有汉化) 用eclipse环境太难搭建了... -
蔚庾三七: 抛弃eclipse搭建的Android开发环境吧!用谷歌新近推出的 Android Studio (最新版本为1.3)中文版或者Android Studio英文版+中文汉化补丁.

纳雍县13362261510: Android 开发板有哪些?如何选择 -
蔚庾三七: 这里我只是给出我选购Android开发板的思路,供大家参考:(1) 一定要支持比较新的Android版本这里我把Android手机也算在Android开发板里面吧.目前,支持Android源码版本最好的手机/开发板应该就是Google的干儿子了(Nexus系列...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网