字体需求

在App开发中,一般都会使用自定义的字体,这些字体美化App的同时,可能还会带来额外的问题,最容易带来的问题就是内存泄露,这里举个实际中遇到的问题作为例子

上面的UI,我们需要在Title、Price上做自定义字体。假如我们这么处理这个需求

Title

Typeface tf=Typeface.createFromAsset(getAssets(), Consts.LANTING_FONT_PATH);

title.setTypeface(tf);

Price

Typeface tf=Typeface.createFromAsset(getAssets(), Consts.LANTING_FONT_PATH);

price.setTypeface(tf);

像上面这么处理,进入这个页面以后,在滚动View的时候会明显卡顿 1S左右, 用户体验相当不好。

接下来看看问题在哪里

跑monkey测试:

发现问题

adb shell dumpsys meminfo 【packgename】

此命令会打出当前应用内存占用情况,如下:

注意很明显的/assets/fonts/fzlthjw.ttf 出现的N多次,而且每次都是2,M多,这个内存占用相当的恐怖了,很明显出现了内存泄露

那么该如何解决?

解决问题

解决的办法比较简单,因为 Typeface.createFromAsset(…)是个高消耗方法,缓存使用即可。

比如像这样:

protected static final Typeface TYPEFACE = Typeface.createFromAsset(

application.getAssets(), "fonts/fzlthjw.ttf");

titile.setTypeface(TYPEFACE );

price.setTypeface(TYPEFACE );

然后我们再次用monkey测试一下:

问题得以解决

推荐方法

不过建议上面的Typeface用Manager管理起来,防止不恰当使用引起内存泄露,下面给个简单的Manager类以供参考:

import java.util.HashMap;

import java.util.Map;

import android.app.Application;

import android.content.res.AssetManager;

import android.graphics.Typeface;

public class FontManager {

private static FontManager FONT_MANAGER;

private AssetManager mAssetManager;

private static final Map CACHE_FONT_MAP = new HashMap();

private FontManager(Application application) {

mAssetManager = application.getAssets();

}

public static void createInstance(Application application) {

if (FONT_MANAGER == null) {

synchronized (FontManager.class) {

if (FONT_MANAGER == null) {

FONT_MANAGER = new FontManager(application);

}

}

}

}

public static FontManager getInstance() {

if (FONT_MANAGER == null) {

throw new NullPointerException("NullPoint Exception, Please call createInstance first!");

}

return FONT_MANAGER;

}

public Typeface getFont(FontType type) {

if (type == null) {

return null;

}

final String key = type.getValue();

Typeface typeface = null;

switch (type) {

case TANG_SH:

if (CACHE_FONT_MAP.containsKey(key)) {

return CACHE_FONT_MAP.get(key);

} else {

typeface = Typeface.createFromAsset(mAssetManager, "fonts/fzlthjw.ttf");

CACHE_FONT_MAP.put(key, typeface);

}

break;

default:

break;

}

return typeface;

}

public static enum FontType {

TANG_SH("tang_sh");

String value;

FontType(String value) {

this.value = value;

}

public String getValue() {

return value;

}

}

// -----------------------------------------------------------------------

// Convenient

// -----------------------------------------------------------------------

public static class FLFont {

public static Typeface getFont(FontType type) {

try {

FontManager manager = FontManager.getInstance();

return manager.getFont(type);

} catch (NullPointerException e) {

e.printStackTrace();

}

return null;

}

}

}

调用的时候在Application中初始化一次

FontManager.createInstance(this);

然后在使用的时候:

title.setTypeface(FLFont.getFont(FontType.TANG_SH))

这样就可以全局避免内存泄露。

Android字体占有内存,Android 字体内存泄露相关推荐

  1. android控制台字体大小设置,Android studio 4.1 豆沙护眼色配置、字体大小设置、内存大小设置...

    1.左边目录栏颜色配置: 2.代码编辑区域背景色设置 3.控制台背景色设置 4.菜单栏.工具栏.左边栏字体大小设置 6.修改内存大小.显示内存 例如:修改android-studio/bin/stud ...

  2. android弹出输入法内存,android 输入法导致内存泄露问题

    该方法侵入太高,必须重新EditText,如果我们直接使用一个第三方的控件包含了EditText,那么这么做就没有意义,所以放弃了这种方案,然后我又想出了其他方案,Android 输入法导致内存泄露以 ...

  3. android如何避免内存泄露,Android开发中应该避免的内存泄露

    一.背景和目的: 目前许多开发人员在Android开发过程中,较少关注实现细节和内存使用,容易会造成内存泄露,导致程序OOM. 本文会通过代码向大家介绍在Android开发过程中常见的内存泄露. 二. ...

  4. android跨进程读写内存,Android 跨进程内存泄露

    内存泄露的检测和修复一直是每个APP的重点和难点,也有很多文章讲述了如何检测和修复.本篇文章 结合最近开发的项目遇到的实例,讲述下Android Binder导致的内存泄露的一个案例. 发现问题 参与 ...

  5. Android之内存泄露、内存溢出、内存抖动分析

      内存 JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆.栈和方法区. 栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放.优点:速度快. 堆(heap) ...

  6. Android APP常见的5类内存泄露及解决方法

    Android APP常见的5类内存泄露及解决方法 参考文章: (1)Android APP常见的5类内存泄露及解决方法 (2)https://www.cnblogs.com/genggeng/p/7 ...

  7. android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...

    Android 支持内存为 512 MB 的设备.本文档旨在帮助 OEM 优化和配置 Android 内核 4.4,使其能够在低内存设备上运行.在下文所述的优化措施中,有几项非常通用,甚至也可应用于以 ...

  8. android 内存抖动_android内存泄漏怎么破?一招教你搞定!

    相信大部分童靴都有听说个名词:内存泄漏,究竟什么是内存泄漏,它具体有什么危害呢?且听我娓娓道来. 01 JVM/ART 首先为大家普及下,java运行时是有一套虚拟机机制存在的:JVM(Java虚拟机 ...

  9. Android 性能监测工具,优化内存、卡顿、耗电、APK的方法

    导语     安卓大军浩浩荡荡,发展已近十个年头,技术优化月新日异,如今 Android 9.0 代号P  都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得 ...

最新文章

  1. mysql缓存淘汰机制_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....
  2. C++实现字符串数组作为函数的参数的反序输出
  3. VS Code 的常用快捷键和插件
  4. Java和HTML有什么区别?哪个更重要?
  5. CF1491H Yuezheng Ling and Dynamic Tree(分块)
  6. xlsxwriter写行合并_使用实现XlsxWriter创建Excel文件并编辑
  7. Java Apple_GitHub - izhaorui/AppleLogin-java: 苹果登录 Sign in with Apple 服务端校验
  8. ●BZOJ 1855 [Scoi2010]股票交易
  9. Python——LOL官方商城皮肤信息爬取(一次练手)
  10. 关于预编译和Stdafx.h的若干问题
  11. C++之explicit探究
  12. TCP/IP协议、DoD模型、OSI模型
  13. 验证控件jQuery Validation Engine调用外部函数验证
  14. bzoj 2440: [中山市选2011]完全平方数(二分+莫比乌斯函数)
  15. centos 对某ip开放 防火墙端口_Centos防火墙设置与端口开放的方法
  16. win10环境redis集群搭建(非主从模式)
  17. MoFlow:生成分子图的可逆流模型
  18. 路由器配置 IP 地址
  19. 大数据领域一些值得读的论文(不断更新
  20. Science重磅:颠覆教科书!科学家找到癌症发生源头,治愈肿瘤有了新思路

热门文章

  1. 今天元宵节啦,给大家用Python送上祝福
  2. 学习区块链(九)--创建僵尸军团进阶Ⅳ
  3. 每年90万吨!新奥股份与切尼尔能源签署LNG长期购销协议
  4. 1028 人口普查 (20 分)测试点3格式错误
  5. java毕业设计台球厅自助管理系统(附源码、数据库)
  6. python—bs4模块解析
  7. ajax tool works,,AJAX Control Toolkit-图解Ajax Control Tool
  8. Linux下通过shell脚本创建账户
  9. 第一章_01_JAVA概述
  10. 过滤器篇(2)-----过滤器设置编码格式与清除浏览器缓存(EncodingFilter , NoCacheFilter)