Принцип работы

AsyncTask

AsyncTask это наиболее основной Android компонент для организации потоков. Его цель – это выполнение тяжелых задач и передача в UI-поток результатов работы. Но при этом нам не надо задумываться о создании Handler и нового потока.

Три часто используемых метода:

doInBackground – будет выполнен в новом потоке, здесь решаем все свои тяжелые задачи. Т.к. поток не основной — не имеет доступа к UI.

onPreExecute – выполняется перед doInBackground, имеет доступ к UI

onPostExecute – выполняется после doInBackground (не срабатывает в случае, если AsyncTask был отменен — об этом в следующих уроках), имеет доступ к UI

Его следует использовать для не слишком продолжительных операций — загрузка небольших изображений, файловые операции, операции с базой данных и т.д.

AsyncTask в старых устройствах не поддерживал параллельное выполнение. С версии HONEYCOMB стало возможным запускать до 5 задач включительно благодаря появившемуся пулу потоков(Thread).

Однако, AsyncTask не подойдет, если вам нужен отложенный запуск задачи, после завершения работы вашей активности/фрагмента. То есть он связан с жизненным циклом активности/фрагмента. Если актвиность/фрагмент будут пересозданы после запуска AsyncTask-а момент работы, то произойдет краш приложения.

Loader
Loader может помочь решить задачи, которые не могут решить AsyncTask привязанные к вьюшке.

Loader автоматически останавливается, когда уничтожается активность и перезапускает себя, после пересоздания активности.

А теперь подробнее. Мы имеем два класса.

LoaderManager – встроен в Activity и Fragment. Как и следует из названия он управляет объектами Loader. Он их создает, хранит, уничтожает и стартует/останавливает. Для взаимодействия с ним используется колбэк интерфейс LoaderCallbacks.

Loader – объект, который должен уметь асинхронно выполнять какую-либо задачу.

5 стандартных методов Loader-а.

onStartLoading – вызывается при старте (onStart) Activity или фрагмента, к которому будет привязан Loader.

onStopLoading – вызывается при остановке (onStop) Activity или фрагмента, к которому будет привязан Loader.

Надо понимать, что два этих метода автоматически не означают, что лоадер начал или закончил работу. Это просто переход в состояние стартован и остановлен. А будет он в это время работать или нет, определять вам.

onForceLoad — в этом методе кодим работу лоадера. Запускаем здесь GetTimeTask, который будет нам время получать асинхронно. Ниже разберем подробно, что он делает.

onAbandon – метод означающий, что лоадер становится неактивным. Далее на примере будет видно, что это означает.

onReset – означает уничтожение лоадера, вызывается при закрытии (onDestroy) Activity или фрагмента, к которому будет привязан Loader. Не вызывается, если onDestroy был вызван, например при смене ориентации.