У меня нет формального обучения кодированию, поэтому, пожалуйста, дайте мне знать, если что-то, что я сделал, считается плохим кодированием
Я использую нижнюю навигационную панель для приложения расписания поездов, которое я делаю. Один из вариантов - это функция рядом: при щелчке рядом в нижнем блоке навигации запускается 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?