在我的应用程序中,我需要处理多个字体文件。因此,我不是每次都创建新实例,而是实现了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的新手。任何人都可以指导我纠正方法吗?
答案 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")