不必要地传递上下文。贵吗?

时间:2018-11-14 02:07:05

标签: android fonts assets android-context

因此,我有这种方法getSpecialCharacter,它是从许多不同的活动中调用的。

public static Spanned getSpecialCharacter(Context context){
    Spanned spanned_character = CacheFactory.spannedCache.get("green");
    if (spanned_character ==null) {
        spanned_character = getSymbolColor(context, " \uf100", Color.GREEN);
        CacheFactory.spannedCache.put("green", spanned_character);
    }
    return spanned_character;
}

private static Spanned getSymbolColor(Context context, String s_symbol, int color){
    Typeface font = Typeface.createFromAsset(context.getAssets(), "font.ttf");
    SpannableString ss = new SpannableString(s_symbol);
    ss.setSpan (new CustomTypefaceSpan(font), 0, s_symbol.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    ss.setSpan(new ForegroundColorSpan(color), 0, s_symbol.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return ss;
}

基本上,它从加载的字体中设置特殊字符,并应用绿色。工作正常。此方法被调用了数百次,因此我缓存了“特殊字符”,以便字体和跨度仅被调用一次(第一次)。

我必须传递上下文才能加载字体,但是仅在第一次需要上下文。我想知道是否通过不必要地传递Context数次来失去性能。这会降低性能吗?有任何改进我的代码的建议吗?

1 个答案:

答案 0 :(得分:2)

不应该。如果Spanned不存在,那么您实际上只是在使用传递的上下文。真正的性能问题在于创建字体本身,该操作只能执行一次。

因为要缓存Spanned而不是Context参数,所以应该没有问题。


编辑:

如果您真的想确保安全,请在调用方法时传递context.getApplicationContext()。只要您的应用正在运行,该Context就不会“过期”,并且一旦它停止运行,它就会被GC。