Android:处理多个字体文件 - 正确的方法

时间:2015-07-11 17:48:01

标签: java android android-layout design-patterns singleton

在我的应用程序中,我需要处理多个字体文件。因此,我不是每次都创建新实例,而是实现了Singleton来获取Typeface:

public class FontSingleton {

    private static FontSingleton instance;
    private static Typeface typeface;

    private FontSingleton(){
        //private constructor to avoid direct creation of objects
    }

    public static FontSingleton getInstance(Context context,String fontFileName){
        if(instance==null){
            instance = new FontSingleton();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), fontFileName);
        }
        return instance;
    }

    public Typeface getTypeFace(){
        return typeface;
    }
}

现在,我可以像这样typeface

FontSingleton.getInstance(mContext,"font1.otf").getTypeFace();

处理内存泄漏和实现Singleton的正确方法是什么?我是设计模式和Android的新手。任何人都可以指导我纠正方法吗?

3 个答案:

答案 0 :(得分:3)

使FontSingleton成为单身人士是没有用的,因为你真正需要的是缓存Typeface对象,而不是创建它们的类。因此,您可以将FontSingleton(不再是单身人士,让我们称之为FontHelper)设为没有实例的类,并让它存储Map Typefaces 。这些将以懒惰的方式创建:如果字体名称没有Typeface - 创建它并将其存储在Map中,否则重用现有实例。这是代码:

public class FontHelper {

    private static final Map<String, Typeface> TYPEFACES = new HashMap<>();

    public static Typeface get(Context context,String fontFileName){
        Typeface typeface = TYPEFACES.get(fontFileName);
        if(typeface == null){
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), fontFileName);
            TYPEFACES.put(fontFileName, typeface);
        }
        return typeface;
    }
}

很抱歉,如果代码不能正常工作,但希望这个想法很明确。

答案 1 :(得分:1)

  

是处理内存泄漏和实现的正确方法   单?

在您将其标记为getInstance()之后,

synchronized应为synchronized,然后,对于模式的实施而言,它是正确的。我认为它仍然不适合你的需要。例如,您无法创建新的TypeFace对象。你编写它的方式使用font1.otf。如果你想要,那么你不需要提供fontname作为getInstance()的参数。

作为替代解决方案,您应该考虑子类TextView的可能性,提供自定义xml属性,您可以通过该属性指定要使用的字体。

答案 2 :(得分:1)

如果我看得正确的话,这是过于复杂和错误的(实例将始终保留第一个字体,因为它已经存在,因为它已经存在,因此它不会再被调用)。

为什么不实现这样的事情:

public class FontHelper {
    public static Typeface get(Context context, String fontFilename) {
        return Typeface.createFromAsset(context.getResources().getAssets(), fontFileName);
    }
}

然后你打电话:

FontHelper.get(mContext,"font1.otf")