【问题标题】:Difference between getContext() and requireContext() when using fragments使用片段时 getContext() 和 requireContext() 的区别
【发布时间】:2020-06-09 15:38:27
【问题描述】:

我很长时间以来一直有这个疑问,当我使用 android 片段并且我需要实例化一个上下文,或者我需要将一个上下文作为其他函数的参数传递时,我可以选择使用之间getContext() 和 requireContext() 方法来实现这一点,我通常更喜欢使用 requireContext(),但这只是因为 IDE(Android Studio) 在我使用 getContext() 时有时会显示警告。但是使用一种或其他方法的结果无论我选择什么,似乎都是一样的。

我的问题是,这两种方法有什么区别吗?如果是这种情况,哪个更好,或者我应该在每种情况下使用哪个?

【问题讨论】:

  • 仅当您确定片段已附加到其主机(onResume、onViewCreated 等)时才使用 requireContext

标签: android android-fragments android-context


【解决方案1】:

getContext() 返回一个可为空的Context

requireContext() 返回一个非空的Context,或者当一个异常不可用时抛出一个异常。

如果您的代码处于生命周期阶段,您知道片段已附加到上下文,只需使用 requireContext() 获取 Context 并让静态分析器对潜在的 NPE 问题感到满意。

如果您的代码超出常规片段生命周期(例如,异步回调),您最好使用getContext(),自己检查其返回值并仅在它为非空时继续使用它。

明确的可空性在 Kotlin 中更为重要,因为它内置于语言的类型系统中。

【讨论】:

  • 然后,如果我确定片段已附加(例如视图),则想法是使用 requireContext(),但如果没有,则 getContext() 并在继续之前验证结果。顺便说一句,非常有用的信息
  • 您能否提供更多示例说明片段何时可​​能未附加到上下文?或者也许是一些我们最常可以确定它会被附加的例子?
  • @AlanNelson 它附加在onAttach()onDetach() 之间,并且常规片段生命周期发生在两者之间。 developer.android.com/guide/fragments/lifecycle - 为分离的片段获取空上下文的通常原因是试图过早获取上下文,例如在初始化阶段,或在生命周期之外,例如在异步回调中。
【解决方案2】:

虽然 Laalto 的回答是正确的,但我正在添加代码来证明 requireContext() 和 getContext 之间的区别。

在 Fragment.java 中,您应该会看到以下代码。

@NonNull
    public final Context requireContext() {
        Context context = getContext();
        if (context == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to a context.");
        }
        return context;
    }

可以看到,当上下文为null时,requireContext()方法会抛出异常。

@Nullable
    public Context getContext() {
        return mHost == null ? null : mHost.getContext();
    }

另一方面,如果您看到 getContext() 的代码,您可能会在调用时得到一个空值。

【讨论】:

  • 好吧,因为我所看到的 getContext() 必须小心处理以避免异常和应用程序崩溃
  • @Ariel,你明白了。
  • 实际上,如果上下文为空,这两种方法都可能导致异常。 requireContext() 立即抛出 IllegalStateException,而当您尝试使用它的结果时,getContext() 可能会导致 NullPointerException。例如 getContext().getResources()
  • @Ridcully,同意!
猜你喜欢
  • 1970-01-01
  • 2018-07-19
  • 2011-09-07
  • 2014-05-10
  • 2012-05-25
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多