zoukankan      html  css  js  c++  java
  • android加载字体内存泄漏的处理方法

    在开发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);
  • 相关阅读:
    JS(JQEERY) 获取JSON对象中的KEY VALUE
    .NET 日期数据的格式化方法
    jquery转换json对象为字符串
    Repeater和Gridview前台显示行号的方法
    Asp.Net对Json字符串的解析和应用
    C++学习之路—运算符重载(一)概念、方法及规则
    C++学习之路—多态性与虚函数(二)纯虚函数与抽象类
    C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性
    软件工程师的优秀品质
    C++学习之路—继承与派生(四)拓展与总结
  • 原文地址:https://www.cnblogs.com/xiajf/p/4138464.html
Copyright © 2011-2022 走看看