未连接片段时,getContext()不返回null吗?

时间:2018-09-04 08:29:44

标签: android android-fragments

Fragment中的一个异步任务过去曾在我的应用突然关闭时崩溃。后执行代码已运行(例如显示Toast),但现在没有应用了。

我以为我通过在运行后执行代码之前检查getContext() != null来解决此问题,但是又遇到了崩溃。

java.lang.IllegalStateException:
  at android.support.v4.app.Fragment.requireContext (Fragment.java:614)
  at android.support.v4.app.Fragment.getResources (Fragment.java:678)
  at android.support.v4.app.Fragment.getString (Fragment.java:700)
  at com.grammarbud.android.grammarbud.MainFragment$2.onBillingServiceDisconnected (MainFragment.java:310)

我读到了

  

片段现在具有requireContext(),requireActivity(),requireHost()和requireFragmentManager()方法,它们返回等效的get方法的NonNull对象或抛出IllegalStateException。

https://developer.android.com/topic/libraries/support-library/revisions.html#27-1-0

这是否意味着getContext()不再返回null?但是,以下摘录是什么意思呢?如果未附加到null,它将返回Activity吗?我听不懂语言。

  

getActivity和getContext方法返回可为空的类型,因为当Fragment未附加到Activity时,这些方法已返回null。行为没有改变,只是现在已对其进行了明确标记,因此您可以放心地对其进行处理。

https://stackoverflow.com/a/47253335/3268303

我的代码(在一个片段中运行)

private void connectToPlayStore() {
    mBillingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) {
            if (billingResponseCode == BillingClient.BillingResponse.OK) {
                if (getContext() != null) {
                    queryProductDetails();
                }
            }
        }
        @Override
        public void onBillingServiceDisconnected() {
            // Line below ***CRASHES*** app if closed prematurely
                SharedHelper.showToast(getContext(), getString(R.string.no_connection_to_play_store));
            }
        }
    });
}

显示SharedHelper的Toast的功能,如果上下文为null会捕获,但是执行对我来说似乎还不够

public static void showToast(Context context, String message) {
    if (context != null) {
        Toast newToast = Toast.makeText(context, message, Toast.LENGTH_LONG);

        showToast(newToast);
    }
}

那么当片段中运行异步任务并且应用突然关闭时,如何正确提供方案?我应该尝试终止与BillingClient.endConnection()的连接吗?这样可以保证后执行代码不会运行吗? docs中没有明确说明。

也有人提到isAdded()。我应该检查isAdded()而不是getActivity() != null && getContext() != null吗?

0 个答案:

没有答案