应用程序保持'从字体缓存中清除'并最终因内存不足而崩溃,android

时间:2011-03-09 20:14:03

标签: android caching fonts crash

我正在构建应用程序的开始(它甚至没有做任何事情,但显示一些按钮),当我运行它时,我在logcat中收到错误消息: “从字体缓存[23条目]中清除193K” 一遍又一遍,直到大约一分钟后,应用程序因内存不足而崩溃。我的3个按钮是自定义按钮,使用自定义字体。字体有问题吗?

2 个答案:

答案 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");
    }
}

这可能看起来有风险,但至少用户可以在我的两个活动之间来回切换而不进入低内存状态!