2016-04-01 6 views
1

Мое приложение продолжает сбой, когда я оставляю его в фоновом режиме, а затем возвращаюсь к приложению на экране. Я считаю, что это имеет какое-то отношение к моей AsyncTask, которая работает в onResume(). В этом answer на одном из комментариев парень говорит, чтобы «отслеживать экземпляр действия и делать асинхронную задачу, ожидая, что она будет не нулевой». Итак, как именно я могу дождаться, пока он не станет нулевым?Звонок getActivity() внутри AsyncTask безопасно

И вообще, какой самый безопасный способ обратиться к действию, когда у вас есть AsyncTask, работающий внутри фрагмента, который будет работать во время изменений жизненного цикла активности/фрагмента?

+0

передать активность asynctask, в этом случае ваша деятельность не будет собираться с мусором до тех пор, пока ваша задача async не будет завершена. – dex

+0

@dex, поэтому вы подразумеваете, что вы не вызываете getActivity() вообще в AsyncTask, а скорее передаете ссылку на активность в AsyncTask? И это автоматически удерживает активность от сбора мусора? –

+0

Просто не используйте AsyncTask. Вместо этого используйте Loader (AsyncTaskLoader - хорошая отправная точка), которая предназначена для надлежащего управления изменениями конфигурации. – kcoppock

ответ

1

Во-первых, вы можете типаж getactivity() с активностью, содержащей этот фрагмент в на создании фрагмента и сделать mActivity глобальную переменную.

MainActivity mActivity = (MainActivity)getActivity(); 

Вы можете использовать эту переменную в дальнейшем AsyncTask и может дополнительно проверить есть ли активность завершается (не проверять нуль)

mActivity.isFinished(); 
-1

Это не рекомендуется. Если вам нужно получить доступ к своей деятельности внутри AsyncTask, лучшим способом будет создание интерфейса, чтобы ваша деятельность реализовала этот интерфейс и передала экземпляр активности в конструкторе AsyncTask. Для вашего AsyncTask потребуется свойство типа интерфейса. Таким образом, вы можете вызвать методы, реализованные в действии с помощью этого интерфейса.

+0

Даже тогда вы рискуете утечкой памяти (так как задача по-прежнему содержит ссылку на Activity). – kcoppock

0

Никогда не рассчитывайте на запущенную (или даже существующую) Activity в фоновом режиме или в фоновом режиме. Помещение AsyncTask в сохраненный Fragment - это хороший способ, чтобы задача выполнялась в результате изменений конфигурации (например, вращения устройства), но не тогда, когда активность находится в фоновом режиме. Все, что должно было работать в фоновом режиме, принадлежит Service.

+0

Я не запускаю что-либо, что будет непрерывно работать в фоновом потоке, поэтому использование сервиса не является для меня проблемой. Я просто хочу, чтобы данные, отображаемые во фрагменте, обновлялись при вызове 'onResume()', поэтому, когда пользователь возвращается к приложению, он загружает самые последние данные. Эти данные извлекаются через AsyncTask. Он содержится в сохраненном фрагменте, но мне также нужно захватывать данные, которые относятся к хостинговой деятельности, поэтому я использую getActivity() в AsynctTask. –