web-dev-qa-db-fra.com

Fuites de mémoire avec une police personnalisée pour définir une police personnalisée

Le code suivant pour définir des polices personnalisées ralentit toute mon application. comment le modifier pour éviter les fuites de mémoire et augmenter la vitesse et bien gérer la mémoire?

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;
    }
    }
41
Marissa Nicholas

Vous devez mettre en cache le TypeFace, sinon vous pourriez risquer des fuites de mémoire sur les anciens combinés . La mise en cache augmentera également la vitesse, car il n'est pas très rapide de lire à tout moment à partir des ressources.

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

J'ai donné un exemple complet sur la façon de charger des polices personnalisées et de style textviews comme réponse à une question similaire . Vous semblez faire la plupart du temps correctement, mais vous devez mettre en cache la police comme recommandé ci-dessus.

111
britzl

Je pense que l'utilisation du cache de polices n'est pas nécessaire. Pouvons-nous procéder de cette façon?

Une modification mineure du code ci-dessus, corrigez-moi si je me trompe.

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

    }
2
Manikanta