android开发内存优化

释放双眼,带上耳机,听听看~!

之前,自己做开发时,代码关注的主要是功能的实现,不过随着app的功能越来越多,代码量越来越大时,发现很多地方出现了app的卡顿现象,所有特意在网上搜集了一些内存优化的资料。这里只是简单记录一下,如果需要知道的详细,大家可以到网上搜索资料。

1.2 查看最大内存限制

ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
int memoryClass = am. getMemoryClass();              //96MB [Mi2S,Android 4.1]

可以通过在AndroidManifest.xml文件中设置来扩大内存限制:(不过不建议使用此参数,建议节省内存)

int largeMemoryClass = am. getLargeMemoryClass();            //384MB  [Mi2S,Android 4.1]

 

 

二、内存优化

  • 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在执行完后自动退出。

 

Tip3:频繁修改时使用 StringBuffer(Thread-Safe)或 StringBuilder(Thread-Unsafe)。

 

Tip 4: 对于常量,请尽量使用static final。

如果使用final定义常量之后,会减少编译器在类生成时初始化<clinit>方法调用时对常量的存储,对于int型常量,将会直接使用其数值来进行替换,而对于String对象将会使用相对廉价的“string constant”指令来替换字段查找表。虽然这个方法并不完全对所有类型都有效,但是,将常量声明为static final绝对是一个好的做法。

Tip 5:对象不用时最好显式置为Null。

对象不用时最好显式置为Null可以减少GC开销。

 

代码片段mResources = this.getResources()对Resources对象进行了初始化。这时Resources对象拥有了当前Activity对象的引用,Activity又引用了整个页面中所有的对象。

如果当前的Activity被重新创建(比如横竖屏切换,默认情况下整个Activity会被重新创建),由于Resources引用了第一次创建的Activity,就会导致第一次创建的Activity不能被垃圾回收器回收,从而导致第一次创建的Activity中的所有对象都不能被回收。这个时候,一部分内存就浪费掉了。所以需要资源时调用this.getResources()代码,而不要去创建变量。

 

其他的对图片的处理可以参考对bitmap进行压缩,还有使用软引用和弱引用,这些可以在网上自己搜索资料,就介绍到这里了。

人已赞赏
Android文章

Android开发带你高效学习MVP+RxJava+Retrofit

2020-3-12 1:25:15

Android文章

Android 可拖动的悬浮按钮

2020-3-12 3:55:16

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索