在开发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 Heap0 0 0 0 24372 23593 758Dalvik Heap30256 30020 0 0 39116 34608 4508Dalvik Other2254 2180 0 0Stack132 132 0 0Cursor8 8 0 0Other dev4 0 4 0.so mmap998 816 12 0.apk mmap1795 0 1636 0.ttf mmap115 0 76 0.dex mmap1215 56 980 0Other mmap406 4 88 0Unknown22295 22292 0 0TOTAL59478 55508 2796 0 63488 58201 5266Objects
Views:840 ViewRootImpl: 7AppContexts:6 Activities: 4Assets:39 AssetManagers: 39Local Binders:47 Proxy Binders: 29Death Recipients:0OpenSSL Sockets:0SQL
MEMORY_USED:296PAGECACHE_OVERFLOW:136 MALLOC_SIZE: 62DATABASES
pgsz dbsz Lookaside(b) cache Dbname4 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);
原文:http://www.cnblogs.com/xiajf/p/4138464.html