我正在构建应用程序的开始(它甚至没有做任何事情,但显示一些按钮),当我运行它时,我在logcat中收到错误消息: “从字体缓存[23条目]中清除193K” 一遍又一遍,直到大约一分钟后,应用程序因内存不足而崩溃。我的3个按钮是自定义按钮,使用自定义字体。字体有问题吗?
答案 0 :(得分:6)
问题是调用Typeface.createFromAsset()。
我减少了创建字体工厂的功能,因此每种字体类型都会调用一次Typeface.createFromAsset()。
字体工厂将字体保存在散列图中,并且可以解决问题。
我在这个链接上找到了解决方案并进行了一些调整:
http://www.levinotik.com/2011/09/22/custom-fonts-in-android-can-cause-issues-heres-how-to-fix-it/
这就是我实施它的方式。
public class FontFactory {
private static FontFactory instance = new FontFactory();
private HashMap<String, Typeface> fontMap = new HashMap<String, Typeface>();
private FontFactory() {
}
public static FontFactory getInstance() {
return instance;
}
public Typeface getFont(String font) {
Typeface typeface = fontMap.get(font);
if (typeface == null) {
typeface = Typeface.createFromAsset(MyApplication.getApplicationContext().getResources().getAssets(), "fonts/" + font);
fontMap.put(font, typeface);
}
return typeface;
}
}
答案 1 :(得分:0)
我已经能够通过在活动类中将Typeface声明为静态来大幅减少此skia消息(以及最终的低内存条件)。
即
public class myActivity extends Activity
{
//font
private static Typeface mFontHelvet;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
if (mFontHelvet == null)
{
mFontHelvet = Typeface.createFromAsset(this.getAssets(), "Helvetica.TTF");
}
myTextView = (TextView) findViewById(R.id.mytextview);
myTextView.setTypeface(mFontHelvet);
myTextView.setText("blah blah");
}
}
这可能看起来有风险,但至少用户可以在我的两个活动之间来回切换而不进入低内存状态!