Принцип работы
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 был вызван, например при смене ориентации.