getContext () не возвращает ноль, когда фрагмент не присоединен? - PullRequest
0 голосов
/ 04 сентября 2018

Асинхронная задача в 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...