Passing Context unnecessarily. Is it costly?
So, I have this method getSpecialCharacter
that's called from many different activities.
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;
}
It basically sets a special character from a loaded font and applies the color green. It works fine. This method gets called hundreds of times, so I cache the "special character" so that the font and the span is only called once (the first time).
I have to pass the context in order to load the font, however the context is only needed the first time. I wonder if I am losing some performance by passing Context hundreds of times unnecessarily. Does this cost any performance? Any suggestions to improve my code?
android fonts assets android-context
add a comment |
So, I have this method getSpecialCharacter
that's called from many different activities.
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;
}
It basically sets a special character from a loaded font and applies the color green. It works fine. This method gets called hundreds of times, so I cache the "special character" so that the font and the span is only called once (the first time).
I have to pass the context in order to load the font, however the context is only needed the first time. I wonder if I am losing some performance by passing Context hundreds of times unnecessarily. Does this cost any performance? Any suggestions to improve my code?
android fonts assets android-context
add a comment |
So, I have this method getSpecialCharacter
that's called from many different activities.
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;
}
It basically sets a special character from a loaded font and applies the color green. It works fine. This method gets called hundreds of times, so I cache the "special character" so that the font and the span is only called once (the first time).
I have to pass the context in order to load the font, however the context is only needed the first time. I wonder if I am losing some performance by passing Context hundreds of times unnecessarily. Does this cost any performance? Any suggestions to improve my code?
android fonts assets android-context
So, I have this method getSpecialCharacter
that's called from many different activities.
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;
}
It basically sets a special character from a loaded font and applies the color green. It works fine. This method gets called hundreds of times, so I cache the "special character" so that the font and the span is only called once (the first time).
I have to pass the context in order to load the font, however the context is only needed the first time. I wonder if I am losing some performance by passing Context hundreds of times unnecessarily. Does this cost any performance? Any suggestions to improve my code?
android fonts assets android-context
android fonts assets android-context
asked Nov 14 '18 at 2:07
seekingStillnessseekingStillness
1,66721330
1,66721330
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
It shouldn't. You're only actually using the passed Context if the Spanned doesn't already exist. The real performance issue would be in creating the Typeface itself, which is done only once.
Since you're caching the Spanned and not the Context parameter, you shouldn't have a problem.
Edit:
If you really want to be safe about it, pass context.getApplicationContext()
when calling the method. That Context never "expires" as long as your app is running, and will be GCed as soon as it stops running.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292185%2fpassing-context-unnecessarily-is-it-costly%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
It shouldn't. You're only actually using the passed Context if the Spanned doesn't already exist. The real performance issue would be in creating the Typeface itself, which is done only once.
Since you're caching the Spanned and not the Context parameter, you shouldn't have a problem.
Edit:
If you really want to be safe about it, pass context.getApplicationContext()
when calling the method. That Context never "expires" as long as your app is running, and will be GCed as soon as it stops running.
add a comment |
It shouldn't. You're only actually using the passed Context if the Spanned doesn't already exist. The real performance issue would be in creating the Typeface itself, which is done only once.
Since you're caching the Spanned and not the Context parameter, you shouldn't have a problem.
Edit:
If you really want to be safe about it, pass context.getApplicationContext()
when calling the method. That Context never "expires" as long as your app is running, and will be GCed as soon as it stops running.
add a comment |
It shouldn't. You're only actually using the passed Context if the Spanned doesn't already exist. The real performance issue would be in creating the Typeface itself, which is done only once.
Since you're caching the Spanned and not the Context parameter, you shouldn't have a problem.
Edit:
If you really want to be safe about it, pass context.getApplicationContext()
when calling the method. That Context never "expires" as long as your app is running, and will be GCed as soon as it stops running.
It shouldn't. You're only actually using the passed Context if the Spanned doesn't already exist. The real performance issue would be in creating the Typeface itself, which is done only once.
Since you're caching the Spanned and not the Context parameter, you shouldn't have a problem.
Edit:
If you really want to be safe about it, pass context.getApplicationContext()
when calling the method. That Context never "expires" as long as your app is running, and will be GCed as soon as it stops running.
edited Nov 14 '18 at 11:00
answered Nov 14 '18 at 2:16
TheWandererTheWanderer
7,11721028
7,11721028
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292185%2fpassing-context-unnecessarily-is-it-costly%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown