活动中的Android上下文可以是静态的吗?

问题描述 投票:0回答:3

我有一个静态函数,我需要访问我的颜色资源。为了访问颜色资源,我需要静态的上下文变量。如果我可以使上下文静态,我很困惑。它有副作用吗?或者,有没有其他方法可以访问我的资源而不使用上下文

这是功能

 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;
  } 
java android kotlin static android-context
3个回答
3
投票

如果我可以使上下文静态,我很困惑。它有副作用吗?

您可以将上下文声明为静态,但不建议在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); 

0
投票

在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是内存泄漏的任何问题。

如果要编写依赖于静态上下文的可测试代码,可能会遇到问题,在这种情况下,我建议您将上下文传递给函数而不是直接访问它。


-2
投票

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();
© www.soinside.com 2019 - 2024. All rights reserved.