【发布时间】:2014-07-21 13:01:29
【问题描述】:
我在我的应用程序中为文本视图使用自定义字体,当我使用这些字体时,我发现它会消耗大量内存(内存泄漏)。每次我进入这个活动,我使用这个字体时,堆大小都会增加。当我从此类中删除文本视图的自定义字体时,我注意到内存消耗减少了。请查看我的示例代码。我把它贴在下面
public class TrebuchetItalicTextView extends TextView {
private static final String fontName = "Trebuchet-ms-italic";
public TrebuchetItalicTextView(Context context, AttributeSet attrs) {
super(context, attrs);
if (!isInEditMode()) {
synchronized (PSDataCache.getSharedCache().getFontCache()) {
if (!PSDataCache.getSharedCache().getFontCache()
.containsKey(fontName)) {
Typeface tf = Typeface.createFromAsset(context.getAssets(),
"fonts/trebucit_0.ttf");
PSDataCache.getSharedCache().setFontCache(fontName, tf);
}
setTypeface(PSDataCache.getSharedCache().getFontCache()
.get(fontName));
}
}
}
}
我在 XML 中使用这个类,如下所示。
<com.android.customviews.TrebuchetItalicTextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="15dp"
android:text="Lorem ipsum dolor sit amet."
android:textColor="#727272"
android:textSize="16sp"
android:textStyle="italic" />
当使用自定义视图时,请看一下内存哑巴。
** MEMINFO in pid 10045 [com.android.test] **
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 0 0 0 15596 14337 1258
Dalvik 44483 11156 44292 64775 43074 21701
Cursor 0 0 0
Ashmem 0 0 0
Other dev 4 36 0
.so mmap 5380 2196 4752
.jar mmap 0 0 0
.apk mmap 362 0 0
.ttf mmap 102 0 0
.dex mmap 964 0 0
Other mmap 1283 320 204
Unknown 9452 528 9448
TOTAL 62030 14236 58696 80371 57411 22959
Objects
Views: 981 ViewRootImpl: 2
AppContexts: 4 Activities: 3
Assets: 28 AssetManagers: 28
Local Binders: 16 Proxy Binders: 19
Death Recipients: 0
OpenSSL Sockets: 1
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
Asset Allocations
zip:/data/app/com.android.test-2.apk:/resources.arsc: 135K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS.ttf: 133K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS.ttf: 133K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS.ttf: 133K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS.ttf: 133K
zip:/data/app/com.android.test-2.apk:/assets/fonts/Trebuchet MS Bold.ttf: 123K
我已将自定义字体放入资产中。谁能指出我哪里出错了。在这种情况下的任何帮助都非常感谢。
【问题讨论】:
-
嗯,您正在将字体添加到缓存中。所以是的,只要缓存继续存在并且该字体没有被踢出缓存,该字体将继续使用内存。
-
“大量”内存是多少?
-
@Karakuri:实际上,当不使用自定义字体时,堆使用率大约在 60%- 64% 左右,而当它突然使用时,它会飙升到 87%。然后整个应用程序变得缓慢或有时崩溃。它也适用于 Nexus 7、Nexus 10 英寸等高端设备。但在低端设备上,这成为一个问题。