Я недавно преобразовал свои действия во фрагменты.
Используя что-то похожее на Tab-Navigation, фрагменты заменяются, когда пользователь выбирает другую вкладку.
После заполнения фрагмента я запускаю хотя бы один AsyncTask для получения информации из Интернета. Однако - если пользователь переключается на другую вкладку так же, как выполняется метод doBackground из моей AsyncTask - фрагмент заменяется , и поэтому я получаю NullPointerException
в отмеченных строках:
@Override
protected Object doInBackground(Object... params) {
...
String tempjson = helper.SendPost(getResources().getText(R.string.apiid)); //ERROR: Fragment not attached
...
}
protected onPostExecute(Object result) {
...
getActivity().getContentResolver() //NULLPOINTEREXCEPTION
getView().findViewById(R.id.button) //NULL
...
}
getActivity()
и getResources()
вызывают ошибку, поскольку мой фрагмент заменен.
То, что я пробовал:
- Вызов метода отмены в моей AsyncTask (не исправит ни первую, ни вторую ошибку, если фрагмент будет заменен во время выполнения
onPostExecute()
)
- проверка, является ли
getActivity()
null
или вызов this.isDetached()
(не реальное решение, и мне нужно проверять это всякий раз, когда я звоню getActivity()
и т. Д.)
Итак, мой вопрос: что было бы лучше, чтобы избавиться от этих проблем AsyncTask? У меня не было этих проблем при использовании Activity, так как они не были «убиты» / отсоединены при смене вкладок (что привело к более высокому использованию памяти - причина, по которой я люблю переключаться на фрагменты)