AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent package such as Executor, ThreadPoolExecutor and FutureTask.
Вы просто неправильно используете AsyncTask, он не должен использоваться для длительных операций. Вместо этого нужно использовать сервис, причем отсоединять листенеры в onPause и подсоединять в onResume, тогда никаких проблем не будет
Из документации:
When your activity receives a call to the onStop() method, it's no longer visible and should release almost all resources that aren't needed while the user is not using it. Once your activity is stopped, the system might destroy the instance if it needs to recover system memory. In extreme cases, the system might simply kill your app process without calling the activity's final onDestroy() callback, so it's important you use onStop() to release resources that might leak memory.
Не всегда уничтожается процесс при нехватке памяти, могут просто освобождаться activity
Еще одна причина ваших утечек памяти — onDestroy. Вызов этого метода не гарантируется и там не стоит освобождать критические ресурсы и отсоединять листенеры. Последний гарантированный метод, который вызовется при уничтожении activity это onPause.
Обычно для таких вещей используются проверенные фреймворки, например, RoboSpice. Который выполняет задачи в сервисе и кэширует http запросы на диск. В onResume подсоединяются листенеры чтобы получить результат. В onPause отсоединяются чтобы не вернуть результат когда fragment уничтожен.
Если запрос выполнился в то время когда fragment скрыт, то запрашиваются данные из кэша.
Если же процесс будет убит, то данные опять же берутся из кэша.
Логика по подсоединению, отсоединению листенеров так же как взятие результатов из кэша делается в BaseFragment.
Все что остается — просто вызвать метод загружающий данные.
Все уже давно изобретено)
Просто распакуйте jar'ку с большим кол-вом методов и скомпилируйте проект, потом распакованное содержимое jar'ки добавьте в скомпилированные сорцы, а после примените proguard. Все лишнее отрежет.
Не стоит всегда использовать sp, т.к. при изменении размера шрифта в настройках вся верстка может поехать. И используйте px для divider'ов если они должны быть 1px, т.к. если указать 1dp, то на ldpi устройствах 1dp округлится в 0px
зачем методы replaceAdapter/swapAdapter? Например, класс TextView обходится одним методом setText и он не только устанавливает текст в первый раз, но и меняет в последующие
уже час прошел, книги нету(
второй абзац из документации
When your activity receives a call to the onStop() method, it's no longer visible and should release almost all resources that aren't needed while the user is not using it. Once your activity is stopped, the system might destroy the instance if it needs to recover system memory. In extreme cases, the system might simply kill your app process without calling the activity's final onDestroy() callback, so it's important you use onStop() to release resources that might leak memory.
Не всегда уничтожается процесс при нехватке памяти, могут просто освобождаться activity
Если запрос выполнился в то время когда fragment скрыт, то запрашиваются данные из кэша.
Если же процесс будет убит, то данные опять же берутся из кэша.
Логика по подсоединению, отсоединению листенеров так же как взятие результатов из кэша делается в BaseFragment.
Все что остается — просто вызвать метод загружающий данные.
Все уже давно изобретено)
Этот подход я описывал здесь
habrahabr.ru/post/219801/
здесь тоже будете использовать sp?