我有一个静态函数,我需要访问我的颜色资源。为了访问颜色资源,我需要静态的上下文变量。如果我可以使上下文静态,我很困惑。它有副作用吗?或者,有没有其他方法可以访问我的资源而不使用上下文
这是功能
private static SpannableStringBuilder setTextColor(
SpannableStringBuilder Text, int spanLength, boolean isSuggestion) {
addressText.setSpan(
new ForegroundColorSpan(
context
.getResources()
.getColor(
isSuggestion ? R.color.blur: R.color.red)),
addressText.length() - 1 - spanLength,
addressText.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return Text;
}
如果我可以使上下文静态,我很困惑。它有副作用吗?
您可以将上下文声明为静态,但不建议在Android中使用,因为它可能会导致应用中的内存泄漏。
有没有其他方法我可以访问我的资源而不使用上下文?
不,您需要一个上下文实例来访问您应用中的资源。
回到你的案例,最简单的方法是将上下文作为方法的参数传递。
private static SpannableStringBuilder setTextColor(Context context, SpannableStringBuilder Text, int spanLength, boolean isSuggestion) {
int color = context.getResources().getColor(isSuggestion ? R.color.blur : R.color.red);
addressText.setSpan(new ForegroundColorSpan(color),
addressText.length() - 1 - spanLength,
addressText.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return Text;
}
在你的活动中,例如,在调用this
时,将setTextColor
作为上下文传递。
setTextColor(this, new SpannableStringBuilder(), 0, false);
在Kotlin中,您可以通过创建一个扩展Application并将应用程序上下文存储在随播对象中的类来实现此目的。
通常它看起来类似于:
class App : Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
private var instance: App? = null
val context: Context?
get() = instance?.applicationContext
}
}
您可以通过App.context
访问上下文
关于存储静态上下文的问题,如果存储活动或片段上下文,则存在创建内存泄漏的风险,但由于我们存储的应用程序上下文与整个应用程序的生命周期相关,因此赢得了t是内存泄漏的任何问题。
如果要编写依赖于静态上下文的可测试代码,可能会遇到问题,在这种情况下,我建议您将上下文传递给函数而不是直接访问它。
1)创建扩展Application的App类
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
2)创建返回上下文的getApplicationContext()方法
public static Context getApplicationContext() {
return context;
}
3)现在你可以在课堂上的任何地方获得上下文
Context context = App.getContext().getApplicationContext();