OKHttp падает при переключении фрагментов - PullRequest
1 голос
/ 10 ноября 2019

У меня нет формального обучения кодированию, поэтому, пожалуйста, дайте мне знать, если что-то, что я сделал, считается плохим кодированием

Я использую нижнюю навигационную панель для приложения расписания поездов, которое я делаю. Один из вариантов - это функция рядом: при щелчке рядом в нижнем блоке навигации запускается NearbyFragment, и мой сервер получает запрос через OKHttp автоматически без дополнительного взаимодействия с пользователем

Проблема заключается в том, что при переключении изРядом с другой кнопкой на нижнем навигационном экране ИЛИ, если вы несколько раз нажали на расположенную рядом кнопку, приложение зависнет. Первоначально это происходило из-за того, что метод runOnUiThread не смог найти поток пользовательского интерфейса, так как я перешел к другому фрагменту (и, предположительно, основной поток больше не существует). Я попытался исправить это, создав 1-секундную задержку перед вызовом метода getLocation в onViewCreated

// Delay before calling on location to prevent crashing when rapidly switching from Nearby Fragment
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (getActivity() != null) {
                    getLocation();
                }
            }
        }, 1000);

. Я также обернул вышеупомянутое, а также методы OKHttp onSuccess и onFailure в операторе if (getActivity! = Null), чтобы проверить, что поток пользовательского интерфейса все еще существует, прежде чем продолжить

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String myResponse = response.body().string();
                    if (getActivity() != null) {
                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                processJSON(myResponse);
                            }
                        });
                    }
                }
            }

. Я по-прежнему получаю сбои, связанные с методом onFailure с NullPointerExceptions и не могу найти представления (такие как закусочная), ЕСЛИ я изменил с NearbyFragment надругой фрагмент после 1 секунды загрузки, но до окончания загрузки, поэтому я включил onFailure в try / catch, чтобы перехватить все исключения и проигнорировать их. Это похоже на взлом, но мое приложение больше не дает сбой / работает, как ожидалось при переключении с NearbyFragment на другой фрагмент с помощью нижней навигации.

@Override
            public void onFailure(Call call, IOException e) {
                try {
                    mSwipeToRefresh.setRefreshing(false);
                    Log.e("Main", e.toString());
                    mSnackbar = Snackbar.make(getActivity().findViewById(R.id.swipe_container_nearby), "ERROR!", Snackbar.LENGTH_INDEFINITE);
                    snackBarCoordinator(mSnackbar);
                    mSnackbar.show();
                } catch (Exception j) {
                    Log.e("Failed Get Closest Stations ", j.toString());
                }
            }

Есть ли очиститель, чтобы остановить сбой без комбинациииз трех сбоев, т. е. handler.postDelayed, (getActivity ()! = null) и пустой блок try / catch?

1 Ответ

0 голосов
/ 10 ноября 2019

Чтобы узнать, есть ли действие или фрагмент в пользовательском интерфейсе.

Для действия вы можете позвонить isFinishing() Для вызова фрагмента isAttached().

, т.е. перед показом загрузчика, закусочной или любого другого. обернуть виджеты if (...) {}

if(isAttached()) { snackbar.show(); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...