【问题标题】:Can an Android Context inside an activity be static?Activity 中的 Android 上下文可以是静态的吗?
【发布时间】:2019-03-05 03:20:35
【问题描述】:

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

这里是函数

 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;
  } 

【问题讨论】:

  • 你能显示所有相关代码吗?
  • 贴一个代码sn-p 用一个例子,把上下文保存到一个静态变量中从来都不是一个好主意。
  • 最好能提供代码。供您参考,将上下文设为静态并不是一个好主意,因为它会导致内存泄漏。
  • 用代码更新了问题
  • 为什么不把Context 作为方法参数传递给方法范围。

标签: java android kotlin static android-context


【解决方案1】:

如果我可以将上下文设为静态,我会感到困惑。有没有副作用 给它?

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

在您的活动中,例如,在调用 setTextColor 时将 this 作为上下文传递。

setTextColor(this, new SpannableStringBuilder(), 0, false); 

【讨论】:

    【解决方案2】:

    在 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在任何地方访问上下文

    关于您对存储静态上下文的担忧,如果您要存储活动或片段上下文,则可能会造成内存泄漏,但由于我们存储的是与整个应用程序的生命周期相关的应用程序上下文,内存泄漏不会有任何问题。

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

    【讨论】:

      【解决方案3】:

      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();
      

      【讨论】:

      • 使用应用程序上下文是个好主意吗?它会导致任何副作用
      • 这是一种方法,每个应用程序都应该有 App 类来初始化和控制 UI。没有错,为什么您认为它可能会引起副作用?如果你不喜欢就离开它,请不要放否定的like。
      • 我没有放否定的like。?
      猜你喜欢
      • 2013-08-24
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多