Основні класи
Зразки коду по темі
Завантажники, які з'явилися в Android 3.0, спрощують асинхронну завантаження даних в операцію або фрагмент. Завантажники мають такі властивості:
- Вони є для будь-яких операцій Activity і фрагментів Fragment.
- Вони забезпечують асинхронну завантаження даних.
- Вони відстежують джерело своїх даних і видають нові результати при зміні контенту.
- Вони автоматично перепідключатися до останнього курсору завантажувача при відтворенні після зміни конфігурації. Таким чином, їм не потрібно повторно запитувати свої дані.
Зведена інформація про API-інтерфейсі завантажувача
Є кілька класів і інтерфейсів, які можуть використовувати завантажувачі в додатку. Вони наведені в цій таблиці:
Абстрактний клас, що пов'язується з Activity або Fragment для управління одним або декількома інтерфейсами Loader. Це дозволяє додатку керувати виконуються досить довго операціями разом з життєвим циклом Activity або Fragment; найчастіше цей клас використовується з CursorLoader. однак додатки можуть писати свої власні завантажувачі для роботи з іншими типами даних.
Є тільки один клас LoaderManager на операцію або фрагмент. Однак у класу LoaderManager може бути кілька загрузчиков.
Інтерфейс зворотного виклику, що забезпечує взаємодію клієнта з LoaderManager. Наприклад, за допомогою методу зворотного виклику onCreateLoader () створюється новий завантажувач.
Абстрактний клас, який виконує асинхронну завантаження даних. Це базовий клас для завантажувача. Зазвичай використовується CursorLoader. але можна реалізувати і власний підклас. Коли завантажувачі активні, вони повинні відслідковувати джерело своїх даних і видавати нові результати при зміні контенту.
Абстрактний завантажувач, який надає AsyncTask для виконання роботи.
Підклас класу AsyncTaskLoader. який запитує ContentResolver і повертає Cursor. Цей клас реалізує протокол Loader стандартним способом для виконання запитів до курсору. Він будується на AsyncTaskLoader для виконання запиту до курсора у фоновому потоці, щоб не блокувати призначений для користувача інтерфейс програми. Використання цього завантажувача - це найкращий спосіб асинхронної завантаження даних з ContentProvider замість виконання керованого запиту через платформу або API-інтерфейси операції.
Наведені в цій таблиці класи і інтерфейси є найбільш важливими компонентами, за допомогою яких в додатку реалізується завантажувач. При створенні кожного завантажувача не потрібно використовувати всі ці компоненти, проте завжди слід вказувати посилання на LoaderManager для ініціалізації завантажувач і використовувати реалізацію класу Loader. наприклад CursorLoader. У наступних розділах розповідається, як використовувати ці класи і інтерфейси в додатку.
Використання завантажувачів в додатку
У цьому розділі описується використання загрузчиков в додатку для Android. У додатках, що використовують завантажувачі, зазвичай є наступні елементи:
запуск завантажувача
LoaderManager управляє одним або декількома екземплярами Loader в Activity або Fragment. Є тільки один LoaderManager на кожну операцію або кожен фрагмент.
Loader зазвичай инициализируется в методі onCreate () операції або в методі фрагмента onActivityCreated (). Робиться це в такий спосіб:
Метод) "> initLoader () приймає такі параметри:
- унікальний ідентифікатор, що позначає завантажувач. В даному прикладі ідентифікатором є 0;
- необов'язкові аргументи, які передаються завантажувачу при побудові (в даному прикладі це null);
- реалізація LoaderManager.LoaderCallbacks. яка викликає клас LoaderManager для видачі подій завантажувача. В даному прикладі локальний клас реалізує інтерфейс LoaderManager.LoaderCallbacks. тому він передає посилання самому собі: this.
Виклик) "> initLoader () забезпечує ініціалізацію завантажувача. Можливий один з двох результатів:
- Якщо завантажувач, вказаний за допомогою ідентифікатора, вже існує, буде повторно використаний завантажувач, створений останнім.
- Якщо завантажувач, вказаний за допомогою ідентифікатора, не існує,) "> initLoader () викликає метод LoaderManager.LoaderCallbacks з onCreateLoader (). Саме тут реалізується код для створення екземпляра і повернення нового завантажувача. Докладнішу інформацію див. У розділі onCreateLoader.
У будь-якому випадку дана реалізація LoaderManager.LoaderCallbacks зв'язується з завантажувачем і буде викликатися при зміні стану завантажувача. Якщо в момент цього виклику викликає компонент знаходиться в занедбаному стані, це означає, що запитаний завантажувач вже існує і сформував свої дані. В цьому випадку система відразу ж викличе, D) "> onLoadFinished () (під час)"> initLoader ()), будьте готові до цього. Більш докладні відомості про це зворотного виклику см. В розділі onLoadFinished.
Зверніть увагу, що метод) "> initLoader () повертає створюваний клас Loader. Але записувати посилання на нього не потрібно. Клас LoaderManager управляє життєвим циклом завантажувача автоматично. Клас LoaderManager почне завантажувати і закінчує її при необхідності, а також підтримує стан завантажувача і пов'язаного з ним контенту. А це має на увазі, що ви будете рідко взаємодіяти з завантажувачами безпосередньо (проте приклад використання методів завантажувача для тонкої настройки його поведінки см. в зразку коду LoaderThrottle). для втручання в процес з завантаження при виникненні певних подій зазвичай використовуються методи LoaderManager.LoaderCallbacks. Більш докладні відомості про це див. у розділі Використання зворотних викликів LoaderManager.
перезапуск завантажувача
При використанні методу) "> initLoader (). Як показано вище, він задіює існуючий завантажувач із зазначеним ідентифікатором - в разі його наявності. Якщо такого завантажувача немає, метод його створить. Однак іноді старі дані потрібно відкинути і почати все заново.
Для видалення старих даних використовується метод) "> restartLoader (). Наприклад, ця реалізація методу SearchView.OnQueryTextListener перезапускає завантажувач, коли змінюється запит користувача. Завантажувач необхідно перезавантажити, з тим щоб він міг використовувати змінений фільтр пошуку для виконання нового запиту:
Використання зворотних викликів класу LoaderManager
LoaderManager.LoaderCallbacks є інтерфейс зворотного виклику, який дозволяє клієнту взаємодіяти з класом LoaderManager.
Очікується, що завантажувачі, зокрема CursorLoader. зберігатимуть свої дані після їх зупинки. Це дозволяє додаткам зберігати свої дані в методах onStop () і onStart () операції або фрагмента, з тим щоб, коли користувач повернеться в додаток, йому не довелося чекати, поки дані завантажаться заново. Методи LoaderManager.LoaderCallbacks використовуються, щоб дізнатися, коли потрібно створити новий завантажувач, а також для того, щоб вказати додатком, коли прийшов час перестати використовувати дані завантажувача.
Інтерфейс LoaderManager.LoaderCallbacks використовує такі методи:
- onCreateLoader () - створює екземпляр і повертає новий клас Loader для даного ідентифікатора.
- , D) "> onLoadFinished () - викликається, коли створений раніше завантажувач завершив завантаження.
- ) "> OnLoaderReset () - викликається, коли стан створеного раніше завантажувача скидається, в результаті чого його дані губляться.
Більш детально ці методи описані в розділах нижче.
onCreateLoader
При спробі доступу до завантажувача (наприклад, за допомогою методу) "> initLoader ()), він перевіряє, чи існує завантажувач, вказаний за допомогою ідентифікатора. Якщо він не існує, він викликає метод LoaderManager.LoaderCallbacks onCreateLoader (). Саме тут і створюється новий завантажувач. Зазвичай це буде клас CursorLoader. однак можна реалізувати і власний підклас класу Loader.
У цьому прикладі метод зворотного виклику onCreateLoader () створює клас CursorLoader. Ви повинні побудувати клас CursorLoader за допомогою його методу конструктора, для чого потрібен повний набір інформації, яка потрібна для виконання запиту до ContentProvider. Зокрема, потрібно:
- uri - URI контенту, який необхідно отримати;
- projection - список стовпців, які будуть повернуті. При передачі null будуть повернуті всі стовпці, а це неефективно;
- selection - фільтр, який оголошує, які рядки повертати, відформатований у вигляді пропозиції SQL WHERE (за винятком самого WHERE). При передачі null будуть повернуті всі рядки для даного URI;
- selectionArgs - у вибірку можна включити символи "?", які будуть замінені значеннями з selectionArgs в порядку проходження в вибірці. Значення будуть прив'язані як рядки;
- sortOrder - порядок розташування рядків, відформатований у вигляді пропозиції SQL ORDER BY (за винятком самого ORDER BY). При передачі null буде використовуватися стандартний порядок сортування, тому, список, можливо, буде несортованими.
onLoadFinished
Цей метод викликається, коли створений раніше завантажувач завершив завантаження. Цей метод гарантовано викликається до вивільнення останніх даних, які були надані цьому завантажувачу. До цього моменту необхідно повністю перестати використовувати старі дані (оскільки вони скоро будуть замінені). Однак цього не слід робити самостійно, оскільки даними володіє завантажувач і він подбає про це.
Завантажувач вивільнить дані, як тільки дізнається, що додаток їх більше не використовує. Наприклад, якщо даними є курсор з CursorLoader. не слід викликати close () самостійно. Якщо курсор розміщується в CursorAdapter. слід використовувати метод swapCursor () з тим, щоб старий Cursor не закрили. наприклад:
onLoaderReset
Цей метод викликається, коли стан створеного раніше завантажувача скидається, в результаті чого його дані губляться. Цей зворотний виклик дозволяє дізнатися, коли дані ось-ось будуть вивільнені, з тим щоб можна було видалити свою посилання на них.
Дана реалізація викликає swapCursor () зі значенням null:
Як приклад далі наведена повна реалізація фрагмента Fragment. який відображає ListView з результатами запиту до постачальника такого контенту, як контакти. Для управління запитом до постачальника використовується клас CursorLoader.
Щоб додаток могло звертатися до контактів користувача, як показано в цьому прикладі, в його маніфесті повинне бути присутнім дозвіл READ_CONTACTS.
інші приклади
У ApiDemos є кілька різних прикладів, які ілюструють використання загрузчиков:
- LoaderCursor - повна версія показаного вище фрагмента.
- LoaderThrottle - приклад того, як використовувати регулювання для скорочення числа запитів, які виконуються постачальником контенту при зміні його даних.
Відомості про завантаження та інсталяцію зразків коду SDK см. В статті Отримання зразків коду.
Follow @AndroidDev on Twitter
Follow Android Developers on Google+
Check out Android Developers on YouTube
This class requires API level or higher
This doc is hidden because your selected API level for the documentation is. You can change the documentation API level with the selector above the left navigation.
For more information about specifying the API level your app requires, read Supporting Different Platform Versions.