Страницы

Поиск по вопросам

среда, 17 апреля 2019 г.

Передача ссылки на Activity в AsyncTask, почему плохо и как можно было иначе

Всё что внизу описано, это то как я использовал интерфейс для получения результата из AsynckTack в главный поток, используя CallBack. Почему мне сказали, что плохо , что я передал ссылку на активити в AsyncTask? И как лучше надо было это исполнить?
Вот в классе MainActivity вызываю такой метод и как видите передаю ссылку на активити в AsyncTack
private void UploadData() { String url = "https://qwerty.ru" ; AsyncUploadingData asyncUploadingData = new AsyncUploadingData(this); asyncUploadingData.execute(url); } }
В AsyncTack вложен интерфейс
interface AsyncResult { void getResult(String answer); }
Объявлен private AsyncResult mCallback;
И в конструкторе принимаю ссылку на активити. И неявно привожу к интерфейсу(правильно так выразиться?)
AsyncUploadingData(AsyncResult mCallback) { this.mCallback = mCallback; }
И в опеределенный момент вызываю метод интерфейса, а интерфейс подключен в MainActivity
mCallback.getResult(answer);


Ответ

Почему мне сказали, что плохо , что я передал ссылку на активити в AsyncTask?
Хранение ссылки на активити в AsyncTask чревато тем, что в случае уничтожения переданной активити в момент работы асинстаска:
а) Произойдет утечка памяти, так как GC не сможет убрать из памяти активити, так как на нее будет хранится ссылка (в случае с strong reference);
б) Вызов методов активити, в лучшем случае, ни к чему не приведет, а в худшем – будут возникать ошибки.
Первая проблема решается хранением активити в виде weak reference, однако вторая проблема остается.
И как лучше надо было это исполнить?
Существует большое количество способов решения данной проблемы.
Например, можно воспользоваться лоадерами или retain-фрагментами (лоадеры сохраняют состояние как раз с помощью retain-фрагментов).
Можно использовать различные библиотеки, например Chronos
Если используете MVP, то можно воспользоваться библиотекой Moxy, которая, в частности, решает возникшую у Вас проблему.

Комментариев нет:

Отправить комментарий