Асинхронная задача в 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 (), которые возвращают объект NonNull эквивалентных методов get или генерируют исключение 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
для отображения тоста, который будет ловить, если контекст 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()
? Будет ли это гарантировать, что код после выполнения не будет запущен? Это явно не сказано в документах .
Также кто-то упомянул isAdded()
. Должен ли я проверить isAdded()
вместо getActivity() != null && getContext() != null
?