内存泄漏与自定义字体设置自定义字体

以下用于设置自定义字体的代码减慢了我的整个应用程序。 我如何修改它以避免内存泄漏,提高速度和pipe理内存呢?

public class FontTextView extends TextView { private static final String TAG = "FontTextView"; public FontTextView(Context context) { super(context); } public FontTextView(Context context, AttributeSet attrs) { super(context, attrs); setCustomFont(context, attrs); } public FontTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setCustomFont(context, attrs); } private void setCustomFont(Context ctx, AttributeSet attrs) { TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.FontTextView); String customFont = a.getString(R.styleable.FontTextView_customFont); setCustomFont(ctx, customFont); a.recycle(); } public boolean setCustomFont(Context ctx, String asset) { Typeface tf = null; try { tf = Typeface.createFromAsset(ctx.getAssets(),"fonts/"+ asset); } catch (Exception e) { Log.e(TAG, "Could not get typeface: "+e.getMessage()); return false; } setTypeface(tf); return true; } } 

你应该cachingTypeFace,否则你可能会冒更大的手机内存泄漏 。 caching也会增加速度,因为它总是从资产读取的速度不是很快。

 public class FontCache { private static Hashtable<String, Typeface> fontCache = new Hashtable<String, Typeface>(); public static Typeface get(String name, Context context) { Typeface tf = fontCache.get(name); if(tf == null) { try { tf = Typeface.createFromAsset(context.getAssets(), name); } catch (Exception e) { return null; } fontCache.put(name, tf); } return tf; } } 

我给出了一个关于如何加载自定义字体和样式textviews作为类似问题的答案的完整示例 。 你似乎正在做的大部分是正确的,但你应该caching上面build议的字体。

我觉得使用字体caching是不需要的。我们可以这样做吗?

上述代码的小改动,如果我错了,纠正我。

 public class FontTextView extends TextView { private static final String TAG = "FontTextView"; private static Typeface mTypeface; public FontTextView(Context context) { super(context); } public FontTextView(Context context, AttributeSet attrs) { super(context, attrs); } public FontTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); if (mTypeface == null) { mTypeface = Typeface.createFromAsset(context.getAssets(), GlobalConstants.SECONDARY_TTF); } setTypeface(mTypeface); } }