Fugas de memoria con una fuente personalizada para establecer una fuente personalizada

El siguiente código para configurar fonts personalizadas ralentiza toda mi aplicación. ¿Cómo lo modifico para evitar pérdidas de memoria y boost la velocidad y administrar bien la memoria?

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; } } 

Debería almacenar en caché el TypeFace, de lo contrario correría el riesgo de pérdidas de memoria en los teléfonos más antiguos . El almacenamiento en caché también boostá la velocidad, ya que no es súper rápido leer activos todo el tiempo.

 public class FontCache { private static Hashtable fontCache = new Hashtable(); 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; } } 

Di un ejemplo completo sobre cómo cargar fonts personalizadas y estilo textviews como una respuesta a una pregunta similar . Parece que está haciendo la mayor parte correctamente, pero debe almacenar en caché la fuente como se recomienda arriba.

Siento que no se necesita utilizar el Caché de fonts. ¿Podemos hacerlo de esta manera?

Un cambio menor en el código anterior. Corrígeme si estoy equivocado.

 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); } }