Android代码内存优化建议Andr

小编有话说

这篇文章主要介绍在实际Android应用程序的开发中,容易导致内存泄露的一些情况。开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么写出来的代码会强壮许多,写这篇文章也是这个初衷。本文从Android开发中的资源使用情况入手,介绍了如何在Bitmap、数据库查询、9-patch、过渡绘制等方面优化内存的使用。

Android资源优化1.Bitmap优化

Android中的大部分内存问题归根结底都是Bitmap的问题,如果打开MAT(Memoryanalyzertool)来看,实际占用内存大的都是一些Bitmap(以byte数组的形式存储)。所以Bitmap的优化应该是我们着重去解决的。Google在其官方有针对Bitmap的使用专门写了一个专题:DisplayingBitmapsEfficiently,对应的中文翻译在:displaying-bitmaps,在优化Bitmap资源之前,请先看看这个系列的文档,以确保自己正确地使用了Bitmap。Bitmap如果没有被释放,那么一般只有两个问题:

用户在使用完这个Bitmap之后,没有主动去释放Bitmap资源。

这个Bitmap资源被引用所以无法被释放。

1.1主动释放Bitmap资源当你确定这个Bitmap资源不会再被使用的时候(当然这个Bitmap不释放可能会让程序下一次启动或者resume快一些,但是其占用的内存资源太大,可能导致程序在后台的时候被杀掉,反而得不偿失),我们建议手动调用recycle()方法,释放其Native内存:

+if(bitmap!=null!bitmap.isRecycled()){bitmap.recycle();bitmap=null;}我们也可以看一下Bitmap.java中recycle()方法的说明:

+/***Freethenativeobjectassociatedwiththisbitmap,andclearthe*referencetothepixeldata.Thiswillnotfreethepixeldatasynchronously;*itsimplyallowsittobegarbagecollectediftherearenootherreferences.*Thebitmapismarkedasdead,meaningitwillthrowanexceptionif*getPixels()orsetPixels()iscalled,andwilldrawnothing.Thisoperation*cannotbereversed,soitshouldonlybecalledifyouaresurethereareno*furtherusesforthebitmap.Thisisanadvancedcall,andnormallyneed*notbecalled,sincethenormalGCprocesswillfreeupthismemorywhen*therearenomorereferencestothisbitmap.*/publicvoidrecycle(){if(!mRecycled){if(nativeRecycle(mNativeBitmap)){//returnvalueindicateswhethernativepixelobjectwasactuallyrecycled.//falseindicatesthatitisstillinuseatthenativelevelandthese//objectsshouldnotbecollectednow.Theywillbecollectedlaterwhenthe//Bitmapitselfiscollected.mBuffer=null;mNinePatchChunk=null;}mRecycled=true;}}......//如果使用过程中抛出异常的判断if(bitmap.isRecycled()){thrownewRuntimeException(Canvas:tryingtousearecycledbitmap+bitmap);}调用bitmap.recycle之后,这个Bitmap如果没有被引用到,那么就会被垃圾回收器回收。如果不主动调用这个方法,垃圾回收器也会进行回收工作,只不过垃圾回收器的不确定性太大,依赖其自动回收不靠谱(比如垃圾回收器一次性要回收好多Bitmap,那么需要的时间就会很多,导致回收的时候会卡顿)。所以我们需要主动调用recycle。1.2主动释放ImageView的图片资源由于我们在实际开发中,很多情况是在xml布局文件中设置ImageView的src或者在代码中调用ImageView.setImageResource/setImageURI/setImageDrawable等方法设置图像,下面代码可以回收这个ImageView所对应的资源:

+privatestaticvoidrecycleImageViewBitMap(ImageViewimageView){if(imageView!=null){BitmapDrawablebd=(BitmapDrawable)imageView.getDrawable();rceycleBitmapDrawable(bd);}}privatestaticvoidrceycleBitmapDrawable(BitmapDrawablebitmapDrawable){if(bitmapDrawable!=null){Bitmapbitmap=bitmapDrawable.getBitmap();rceycleBitmap(bitmap);}bitmapDrawable=null;}privatestaticvoidrceycleBitmap(Bitmapbitmap){if(bitmap!=null!bitmap.isRecycled()){bitmap.recycle();bitmap=null;}}1.3主动释放ImageView的背景资源如果你的ImageView是有Background,那么下面的代码可以释放他:

+publicstaticvoidrecycleBackgroundBitMap(ImageViewview){if(view!=null){BitmapDrawablebd=(BitmapDrawable)view.getBackground();rceycleBitmapDrawable(bd);}}publicstaticvoidrecycleImageViewBitMap(ImageViewimageView){if(imageView!=null){BitmapDrawablebd=(BitmapDrawable)imageView.getDrawable();rceycleBitmapDrawable(bd);}}privatestaticvoidrceycleBitmapDrawable(BitmapDrawablebitmapDrawable){if(bitmapDrawable!=null){Bitmapbitmap=bitmapDrawable.getBitmap();rceycleBitmap(bitmap);}bitmapDrawable=null;}1.尽量少用Png图,多用NinePatch的图现在手机的分辨率越来越高,图片资源在被加载后所占用的内存也越来越大,所以要尽量避免使用大的PNG图,在产品设计的时候就要尽量避免用一张大图来进行展示,尽量多用NinePatch资源。Android中的NinePatch指的是一种拉伸后不会变形的特殊png图,NinePatch的拉伸区域可以自己定义。这种图的优点是体积小,拉伸不变形,可以适配多机型。AndroidSDK中有自带NinePatch资源制作工具,Android-Studio中在普通png图片点击右键可以将其转换为NinePatch资源,使用起来非常方便。1.5使用大图之前,尽量先对其进行压缩

图片有不同的形状与大小。在大多数情况下它们的实际大小都比需要呈现出来的要大很多。例如,系统的Gallery程序会显示那些你使用设备camera拍摄的图片,但是那些图片的分辨率通常都比你的设备屏幕分辨率要高很多。考虑到程序是在有限的内存下工作,理想情况是你只需要在内存中加载一个低分辨率的版本即可。这个低分辨率的版本应该是与你的UI大小所匹配的,这样才便于显示。一个高分辨率的图片不会提供任何可见的好处,却会占用宝贵的(precious)的内存资源,并且会在快速滑动图片时导致(incurs)附加的效率问题。Google







































白癜风专科医院在哪里
北京治疗白癜风一共要花多少钱



转载请注明:http://www.gslnbdf.com/azfz/1451.html

  • 上一篇文章:
  •   
  • 下一篇文章: