使用片段时 getContext() 和 requireContext() 的区别

Ari*_*iel 18 android android-context android-fragments

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

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

laa*_*lto 41

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

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

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

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

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

  • 然后,如果我确定片段已附加(例如视图),则使用 requireContext() ,但如果没有,则使用 getContext() 并在继续之前验证结果。顺便说一下,非常有用的信息 (2认同)

Nag*_*ram 12

虽然 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

@Nullable
    public Context getContext() {
        return mHost == null ? null : mHost.getContext();
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,如果 context 为 null,这两种方法都可能会导致异常。requireContext() 立即抛出 IllegalStateException,而 getContext() 可能会在您尝试使用其结果时导致 NullPointerException。例如 getContext().getResources() (6认同)