web-dev-qa-db-ja.com

カスタムフォントを設定するためのカスタムフォントのメモリリーク

カスタムフォントを設定する次のコードは、アプリ全体の速度を低下させます。メモリリークを回避し、速度を上げてメモリを適切に管理するために、どのように変更しますか?

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

そうでない場合は、TypeFaceをキャッシュする必要があります 古い携帯電話でメモリリークが発生する可能性があります 。キャッシングは、アセットから常に読み取るのが超高速ではないため、速度も向上します。

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

同様の質問に対する回答としてカスタムフォントとスタイルテキストビューを読み込む方法の完全な例 を示しました。あなたはそれのほとんどを正しくしているように見えますが、上記で推奨されているようにフォントをキャッシュする必要があります。

111
britzl

フォントキャッシュを使用する必要はないと感じていますが、この方法を使用できますか?

上記のコードのマイナーな変更、私が間違っている場合は修正してください。

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