Android字体占有内存,Android 字体内存泄露
字体需求
在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 字体内存泄露相关推荐
- android控制台字体大小设置,Android studio 4.1 豆沙护眼色配置、字体大小设置、内存大小设置...
1.左边目录栏颜色配置: 2.代码编辑区域背景色设置 3.控制台背景色设置 4.菜单栏.工具栏.左边栏字体大小设置 6.修改内存大小.显示内存 例如:修改android-studio/bin/stud ...
- android弹出输入法内存,android 输入法导致内存泄露问题
该方法侵入太高,必须重新EditText,如果我们直接使用一个第三方的控件包含了EditText,那么这么做就没有意义,所以放弃了这种方案,然后我又想出了其他方案,Android 输入法导致内存泄露以 ...
- android如何避免内存泄露,Android开发中应该避免的内存泄露
一.背景和目的: 目前许多开发人员在Android开发过程中,较少关注实现细节和内存使用,容易会造成内存泄露,导致程序OOM. 本文会通过代码向大家介绍在Android开发过程中常见的内存泄露. 二. ...
- android跨进程读写内存,Android 跨进程内存泄露
内存泄露的检测和修复一直是每个APP的重点和难点,也有很多文章讲述了如何检测和修复.本篇文章 结合最近开发的项目遇到的实例,讲述下Android Binder导致的内存泄露的一个案例. 发现问题 参与 ...
- Android之内存泄露、内存溢出、内存抖动分析
内存 JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆.栈和方法区. 栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放.优点:速度快. 堆(heap) ...
- Android APP常见的5类内存泄露及解决方法
Android APP常见的5类内存泄露及解决方法 参考文章: (1)Android APP常见的5类内存泄露及解决方法 (2)https://www.cnblogs.com/genggeng/p/7 ...
- android开机自动开启zram,低内存配置 | Android 开源项目 | Android Open Source Project...
Android 支持内存为 512 MB 的设备.本文档旨在帮助 OEM 优化和配置 Android 内核 4.4,使其能够在低内存设备上运行.在下文所述的优化措施中,有几项非常通用,甚至也可应用于以 ...
- android 内存抖动_android内存泄漏怎么破?一招教你搞定!
相信大部分童靴都有听说个名词:内存泄漏,究竟什么是内存泄漏,它具体有什么危害呢?且听我娓娓道来. 01 JVM/ART 首先为大家普及下,java运行时是有一套虚拟机机制存在的:JVM(Java虚拟机 ...
- Android 性能监测工具,优化内存、卡顿、耗电、APK的方法
导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化月新日异,如今 Android 9.0 代号P 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得 ...
最新文章
- mysql缓存淘汰机制_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....
- C++实现字符串数组作为函数的参数的反序输出
- VS Code 的常用快捷键和插件
- Java和HTML有什么区别?哪个更重要?
- CF1491H Yuezheng Ling and Dynamic Tree(分块)
- xlsxwriter写行合并_使用实现XlsxWriter创建Excel文件并编辑
- Java Apple_GitHub - izhaorui/AppleLogin-java: 苹果登录 Sign in with Apple 服务端校验
- ●BZOJ 1855 [Scoi2010]股票交易
- Python——LOL官方商城皮肤信息爬取(一次练手)
- 关于预编译和Stdafx.h的若干问题
- C++之explicit探究
- TCP/IP协议、DoD模型、OSI模型
- 验证控件jQuery Validation Engine调用外部函数验证
- bzoj 2440: [中山市选2011]完全平方数(二分+莫比乌斯函数)
- centos 对某ip开放 防火墙端口_Centos防火墙设置与端口开放的方法
- win10环境redis集群搭建(非主从模式)
- MoFlow:生成分子图的可逆流模型
- 路由器配置 IP 地址
- 大数据领域一些值得读的论文(不断更新
- Science重磅:颠覆教科书!科学家找到癌症发生源头,治愈肿瘤有了新思路
热门文章
- 今天元宵节啦,给大家用Python送上祝福
- 学习区块链(九)--创建僵尸军团进阶Ⅳ
- 每年90万吨!新奥股份与切尼尔能源签署LNG长期购销协议
- 1028 人口普查 (20 分)测试点3格式错误
- java毕业设计台球厅自助管理系统(附源码、数据库)
- python—bs4模块解析
- ajax tool works,,AJAX Control Toolkit-图解Ajax Control Tool
- Linux下通过shell脚本创建账户
- 第一章_01_JAVA概述
- 过滤器篇(2)-----过滤器设置编码格式与清除浏览器缓存(EncodingFilter , NoCacheFilter)