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
吗?