Loaders (and why we should use them)
-
Upload
michael-pustovit -
Category
Technology
-
view
202 -
download
0
description
Transcript of Loaders (and why we should use them)
![Page 1: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/1.jpg)
почему с ними стоит дружить?
Loaders
![Page 2: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/2.jpg)
Проблемахотим плавный графический интерфейс без
тормозов
![Page 3: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/3.jpg)
Решениевыносим все время-затратные процессы в
фон
![Page 4: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/4.jpg)
Простейший случай
![Page 5: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/5.jpg)
Инструменты для решениявстроенные в Java классы для роботы с
многопоточностью (Thread, Runnable, etc)
![Page 6: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/6.jpg)
Недостатки● никаких “удобств” для организации
межпроцессного взаимодействия ○ много кода - легко запутаться и допустить ошибку
● не адаптированны для Android’а○ проблемы с производительностью (если не
использовать пул потоков)○ ничего не знают про жизненный цикл
компонентов
![Page 7: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/7.jpg)
Частное решение - AsyncTask● Значительно упрощает межпроцессное
взаимодействие● Использует пул (производительность++)
![Page 8: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/8.jpg)
Активности не вечныочень не вечны...
![Page 9: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/9.jpg)
Проблемафоновые процессы должны “переживать” пересоздание активности и доставлять
результат в новую активность
![Page 10: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/10.jpg)
![Page 11: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/11.jpg)
Решениеиспользовать компоненты отвязанные от
контекста активности
![Page 12: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/12.jpg)
Инструменты для решения● сервис (Robospice)● RxJava + фрагменты● лоадеры● веселые комбинации из предыдущих трех
![Page 13: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/13.jpg)
Справедливости ради, нужно отметить, что асинктаски все еще пользуются популярностью
![Page 14: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/14.jpg)
Обычно, случается совсем не сразу после сокрытия активности + сетевые запросы не настолько длинные
![Page 15: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/15.jpg)
![Page 16: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/16.jpg)
Сервисы+маловероятно, что система убъет приложение+много хорошо развитых библиотек-трудности взаимодействия с сервисом-библиотеки Гуглом не поддерживаются, судьба их туманна
![Page 17: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/17.jpg)
RxJava+ бОльшая ориентированность на событийную модель-+другая парадигма программирования-без Retrolambda очень много шаблонного кода
![Page 18: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/18.jpg)
Кто такой этот ваш лоадер?Это кто-то умеющий:● загрузить данные● хранить их в себе● отслеживать изменения в данных и доставлять
новые данные● реагировать на события жизненного цикла
![Page 19: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/19.jpg)
Состояния Loader’а● started - лоадер загружает/хранит данные и следит
за обновлениями● stopped - лоадер следит за обновлениями, но не
сообщает о них● reset - лоадер не содержит в себе данных и не
следит за изменениями
![Page 20: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/20.jpg)
![Page 21: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/21.jpg)
LoaderManager● привязывается к активности/фрагменту и
переживает configuration change
● хранит ссылки на лоадеры
● обеспечивает жизненный цикл лоадеров
![Page 22: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/22.jpg)
Методы LoaderManager‘а○ initLoader() - создает и запускает лоадер. Если
лоадер содержит данные - возвращает их немедленно
○ restartLoader() - создает или пересоздает лоадер,
при этом данные загружаются заново
○ destroyLoader() - уничтожает лоадер
![Page 23: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/23.jpg)
LoaderCallbacksТочка коммуникации View и LoaderManager
public class SampleActivity extends Activity implements LoaderManager.LoaderCallbacks<D> {
public Loader<D> onCreateLoader(int id, Bundle args) { // фабричный метод для лоадера }
public void onLoadFinished(Loader<D> loader, D data) { // обработка результатов }
public void onLoaderReset(Loader<D> loader) { // освобождение ресурсов }}
![Page 24: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/24.jpg)
![Page 25: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/25.jpg)
До API level 11 у активности были такие методы:
● public void startManagingCursor(Cursor)
● public void stopManagingCursor(Cursor)
● public Cursor managedQuery(Uri, String, String, String, String)
Почему все началось с курсоров?они и до сих пор есть, но deprecated
![Page 26: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/26.jpg)
Но что-то было не так...+активность сама обслуживает курсор-курсор пересоздавался при пересоздании активности-все в UI потоке
![Page 27: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/27.jpg)
getLoaderManager().initLoader(LOADER_ID, null, new LoaderManager.LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { return new CursorLoader(getActivity(), "content://com.foo.bar/dog", null, null, null, null); } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { if (cursor != null && cursor.moveToFirst()) someView.setText(cursor.getString(0)); } @Override public void onLoaderReset(Loader<Cursor> cursorLoader) { // если бы тут был курсор адаптер, мы бы свапнули курсор }});
CursorLoader все порешал
![Page 28: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/28.jpg)
Реализация собственного Loader’а● рекомендуется использовать AsyncTaskLoader
● нужно будет переопределить○ loadInBackground()
○ onStartLoading()
○ onStopLoading()
○ onReset()
○ onCanceled()
○ deliverResult(D results)
![Page 29: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/29.jpg)
![Page 30: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/30.jpg)
● loadInBackground()
○ Фоновая операция. Именно в ней данные загружаются.
● onStartLoading()
○ проверить нет ли у нас загруженных данных и если есть,
то вернуть их немедленно
○ если данных нет, то форсировать их загрузку
○ запустить механизм, который будет отслеживать
изменения в данных
● onStopLoading()
○ перестать уведомлять о новых данных, но быть готовым к
старту
![Page 31: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/31.jpg)
● onReset()
○ остановить загрузку
○ прекратить отслеживать изменения данных
● onCanceled()
○ попытаться остановить текущую загрузку
○ почистить загруженные данные
● deliverResult(D results)
○ если лоадер в reset состоянии - освободить ресурсы
○ иначе доставить новые данные и освободить ресурсы
устаревших данных
![Page 32: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/32.jpg)
![Page 33: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/33.jpg)
Сейчас я полезу в идею, показать вам немного кода для кастомного лоадера.
Наверняка что-то повлится, так что заранее прошу прощения за косячки ;)
![Page 34: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/34.jpg)
Loader’ы+безболезненно переживают пересоздание+хорошо документированны+”официальный” инструмент-приложение могут убить-жизненный цикл не самый простой
![Page 35: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/35.jpg)
Мораль● не стоит пренебрегать лоадерами
● для простого сетевого взаимодействия лоадеры
вполне могут подойти
● можно использовать лоадеры как фасад к
другому инструменту асинхронной загрузки
![Page 36: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/36.jpg)
● Серия статей про Loaders (by Alex Lockwood)● Android networking without pain (презентация)● Modern techniques for implementing REST clients
on Android 4.0 and below● CWAC-LoaderEx and Failed Abstractions● Android tutorial to learn through small projects
(оно на китайском)● Пример на GitHub
Интересности найденные в процессе подготовки презенташки
это все ссылочки - можно кликать
![Page 37: Loaders (and why we should use them)](https://reader036.fdocuments.us/reader036/viewer/2022062708/5588f690d8b42aad418b45e6/html5/thumbnails/37.jpg)
Спасибо за внимание!
Мои контакты:Миша Пустовит
Stanfyhttps://google.com/+ПустовитМихаил