不必要地传递上下文。成本高吗?
Passing Context unnecessarily. Is it costly?
所以,我有这个方法 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;
}
它基本上是从加载的字体中设置一个特殊字符并应用绿色。它工作正常。这个方法被调用了数百次,所以我缓存了 "special character" 以便字体和跨度只被调用一次(第一次)。
我必须传递上下文才能加载字体,但是只有第一次需要上下文。我想知道我是否因为不必要地传递上下文数百次而失去了一些性能。这会影响性能吗?有什么改进我的代码的建议吗?
不应该。如果 Spanned 尚不存在,您实际上只是在使用传递的上下文。真正的性能问题在于创建字体本身,这只需要完成一次。
由于您缓存的是 Spanned 而不是 Context 参数,所以应该没有问题。
编辑:
如果你真的想安全一点,在调用方法时传递context.getApplicationContext()
。只要您的应用是 运行,该上下文就永远不会 "expires",并且一旦它停止 运行。
就会被 GC 处理
所以,我有这个方法 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;
}
它基本上是从加载的字体中设置一个特殊字符并应用绿色。它工作正常。这个方法被调用了数百次,所以我缓存了 "special character" 以便字体和跨度只被调用一次(第一次)。
我必须传递上下文才能加载字体,但是只有第一次需要上下文。我想知道我是否因为不必要地传递上下文数百次而失去了一些性能。这会影响性能吗?有什么改进我的代码的建议吗?
不应该。如果 Spanned 尚不存在,您实际上只是在使用传递的上下文。真正的性能问题在于创建字体本身,这只需要完成一次。
由于您缓存的是 Spanned 而不是 Context 参数,所以应该没有问题。
编辑:
如果你真的想安全一点,在调用方法时传递context.getApplicationContext()
。只要您的应用是 运行,该上下文就永远不会 "expires",并且一旦它停止 运行。