在开发android app的开发过程中,会使用到外部的一些字体。外部字体在加载的时候,容易造成内存泄漏。
比如:
Typeface tf=Typeface.createFromAsset(getAssets(), Consts.LANTING_FONT_PATH);
title.setTypeface(tf);
如果在每次调用的时候都这样写,会造成每次执行的时候都会重新加载一次该字体,导致内存不断变大。
跑monkey测试的时候,执行:
adb shell dumpsys meminfo 【packgename】
此命令会打出当前应用内存占用情况,如下:
** MEMINFO in pid 26390 [packgemane] ** Pss Private Private Swapped Heap Heap Heap Total Dirty Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 0 0 0 0 24372 23593 758 Dalvik Heap 30256 30020 0 0 39116 34608 4508 Dalvik Other 2254 2180 0 0 Stack 132 132 0 0 Cursor 8 8 0 0 Other dev 4 0 4 0 .so mmap 998 816 12 0 .apk mmap 1795 0 1636 0 .ttf mmap 115 0 76 0 .dex mmap 1215 56 980 0 Other mmap 406 4 88 0 Unknown 22295 22292 0 0 TOTAL 59478 55508 2796 0 63488 58201 5266 Objects Views: 840 ViewRootImpl: 7 AppContexts: 6 Activities: 4 Assets: 39 AssetManagers: 39 Local Binders: 47 Proxy Binders: 29 Death Recipients: 0 OpenSSL Sockets: 0 SQL MEMORY_USED: 296 PAGECACHE_OVERFLOW: 136 MALLOC_SIZE: 62 DATABASES pgsz dbsz Lookaside(b) cache Dbname 4 116 80 28/19/5 /××××××4 16 110 9/18/4 /×××××× Asset Allocations zip:/system/app/×××××.apk:/assets/fonts/Roboto-Light.ttf: 366K zip:/system/app/×××××.apk:/assets/fonts/Lantinghei.TTF: 2344K zip:/system/app/×××××.apk:/assets/fonts/CoreSansM25ExtraLight.ttf: 210K zip:/system/app/×××××.apk:/assets/fonts/CoreSansM25ExtraLight.ttf: 210K ... ... ... zip:/system/app/×××××.apk:/assets/fonts/CoreSansM25ExtraLight.ttf: 210K
从日志可以看出CoreSansM25ExtraLight这个字体被加载了多次,导致内存泄漏。
如和解决字体内存泄漏呢?方法很简单:
将字体定义为常量,仅在oncreate方法中进行初始化即可。
Consts.TF_CORESANS_FONT = Typeface.createFromAsset(getAssets(), Consts.CORESANS_FONT_PATH);