Урок 135. Loader. LoaderManager. AsyncTaskLoader

Обсуждение уроков
Ответить
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение damager82 » 10 ноя 2013, 23:00

В этом уроке:
- изучаем Loader и AsyncTaskLoader


Click here to read this article!
Последний раз редактировалось damager82 28 май 2017, 21:50, всего редактировалось 3 раза.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение hard » 11 ноя 2013, 11:04

Спасибо за урок! Вопрос такой-что дает использование лоадеров? Более простое управление потоками? То есть нам самим не надо останавливать при выходе из приложения и тд?!

Tkas
Сообщения: 5
Зарегистрирован: 24 янв 2012, 16:55

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение Tkas » 03 дек 2013, 10:41

Присоединяюсь к вопросу!
Нашел ответ на хабрахабре:
Вы не написали в чём же главное преимущество Loader'ов: их жизненный цикл отвязан от конкретной активности и управляется LoaderManager'ом. Это решает очень распространённую в 2.х проблему: вы начали загрузку чего-то тяжёлого в отдельном потоке (в асинктаске или руками созданном потоке, не суть), а активность пересоздалась (перевернули девайс). Асинтаска в панике — возвращать результат некуда, а вам нужно либо начинать загрузку заново либо придумывать велосипед по сохранению результатов загрузки. Loader'ы полностью решают эту проблему: вы просите у менеджера экземпляр лоадера по идентификатору. Если лоадер не был создан — менеджер его создаст, иначе — отдаст существующий экземпляр. То есть инициировать создание лоадера может одна активность, а получить результат уже совсем другая.
http://habrahabr.ru/company/eastbanctech/blog/192998/

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение altwin » 11 дек 2013, 19:21

В методе observerClick(класса MainActivity) используется метод -dispatchChange(false) -depricated in API level 16...
правильно будет так:
dispatchChange(false, null), т.е. просто нужно указать второй параметр(Uri), который в данном случае можно просто передать, как null.
Изображение

McMerphy
Сообщения: 1
Зарегистрирован: 26 дек 2013, 07:37

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение McMerphy » 26 дек 2013, 08:01

Спасибо за ваши уроки.

В моём Activity implements LoaderCallbacks<String> в методе onCreate(...) выполняется метод getLoaderManager().initLoader(...). А далее forceLoad() при !loader.isStarted().
После выполнения loadInBackground() в методе onLoadFinished(...) обновляю UI и запускаю задачу повторно с помощью getLoaderManager().getLoader(...).forceLoad().
И так до окончания работы приложения.
Так вот, если в процессе выполнения loadInBackground() сменить ориентацию экрана, срабатывает onLoadFinished(...) с результатом предыдущих вычислений, как и у вас в уроке.
Но после окончания работы loadInBackground() метод onLoadFinished(...) в логах не появляется и, соответственно, UI не обновляется.
При последующих запусках loadInBackground() всё работает правильно.
Подозреваю, что это происходит из-за того что при выполнении onCreate(...) активити разрушается и создаётся новое, а при getLoaderManager().initLoader(...) лоадеру передаётся уже новый колбэк-объект, который ссылается на текущее созданное активити. Но если loadInBackground() запустился в старом активити, то он не вызывает onLoadFinished(...) текущего активити.
Как можно это исправить?

Аватара пользователя
MeTeOpA
Сообщения: 85
Зарегистрирован: 07 мар 2012, 12:50

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение MeTeOpA » 01 мар 2014, 01:22

Я что то не понял а зачем нужны Лоадеры если мы все равно используем AsyncTask для асинхронной обработки данных. Или это чисто для примера ты взял?

И в чем тогда отличие от пула потоков и LoaderManager кроме доступа к UI как я понял?

Аватара пользователя
Atetc
Сообщения: 45
Зарегистрирован: 02 май 2014, 13:13
Откуда: Уфа
Контактная информация:

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение Atetc » 30 окт 2014, 16:47

Посоветуйте как лучше реализовать TIMEOUT который дает Loader-у например 5 секунд времени на сетевой запрос, если никакого ответа от сервера нет, то завершает Loader.
Русскоязычный чат Android разработчиков https://gitter.im/rus-speaking/android

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение GRAF_COLLIOSTRO » 24 фев 2015, 11:56

McMerphy писал(а):...
Подозреваю, что это происходит из-за того что при выполнении onCreate(...) активити разрушается и создаётся новое, а при getLoaderManager().initLoader(...) лоадеру передаётся уже новый колбэк-объект, который ссылается на текущее созданное активити. Но если loadInBackground() запустился в старом активити, то он не вызывает onLoadFinished(...) текущего активити...
вот я тоже подозреваю) причём ВСЕХ)

У меня всё таже проблема: Есть запрос/ответ по блютусине. Требуется организовать всё не в основном потоке. Подходов я смотрю миллион. ЧТО КОНКРЕТНО ДЛЯ ЧЕГО ЮЗАТЬ? - вот основной вопрос(((

как победить этот момент я так и не понял: ждём ответа от лоадера - наклонили телефон, неважно что произошло... и вот приходит ответ... куда? как? у меня же новое активити... (((

ну согласитесь, не вариант запрещать поворот экрана(((

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение Foenix » 24 фев 2015, 12:24

Можно и запретить но! Только на время выполнения задачи. Разница понятна? Подходит в некоторых случаях.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение altwin » 24 фев 2015, 12:25

GRAF_COLLIOSTRO писал(а):
McMerphy писал(а):...
Подозреваю, что это происходит из-за того что при выполнении onCreate(...) активити разрушается и создаётся новое, а при getLoaderManager().initLoader(...) лоадеру передаётся уже новый колбэк-объект, который ссылается на текущее созданное активити. Но если loadInBackground() запустился в старом активити, то он не вызывает onLoadFinished(...) текущего активити...
вот я тоже подозреваю) причём ВСЕХ)

У меня всё таже проблема: Есть запрос/ответ по блютусине. Требуется организовать всё не в основном потоке. Подходов я смотрю миллион. ЧТО КОНКРЕТНО ДЛЯ ЧЕГО ЮЗАТЬ? - вот основной вопрос(((

как победить этот момент я так и не понял: ждём ответа от лоадера - наклонили телефон, неважно что произошло... и вот приходит ответ... куда? как? у меня же новое активити... (((

ну согласитесь, не вариант запрещать поворот экрана(((
для этого придумали сервисы.
Изображение

postflow
Сообщения: 11
Зарегистрирован: 25 ноя 2015, 11:41

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение postflow » 05 май 2016, 14:28

Верно ли будет утверждение что AsyncTaskLoader выполняется не в UI потоке. По этой причине выполнение длительного сетевого предпочтительней выполнять в нём(а не в Loader) ? Что исключит тормоза с actyvity.

Другими словами AsyncTaskLoader идеально подходит для REST архитектуры. Верно?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение Foenix » 05 май 2016, 19:03

они одинаковые, просто а.т.лоадер содержит в себе уже код для выполнения асинхронной задачи. Но оба предназначены для бэкграунд загрузки из базы данных. Для сетевых запросов мало подходит. Посмотри наш последний вебинар, там вначале кратко объясняется почему не подходит, а потом что использовать для асинхронных сетевых задач и дан очень хороший пример.

Для запросов - ретрофит.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

postflow
Сообщения: 11
Зарегистрирован: 25 ноя 2015, 11:41

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение postflow » 06 май 2016, 10:54

Foenix писал(а):они одинаковые, просто а.т.лоадер содержит в себе уже код для выполнения асинхронной задачи. Но оба предназначены для бэкграунд загрузки из базы данных. Для сетевых запросов мало подходит. Посмотри наш последний вебинар, там вначале кратко объясняется почему не подходит, а потом что использовать для асинхронных сетевых задач и дан очень хороший пример.

Для запросов - ретрофит.
Для тех кто зашел с googl-a: https://www.youtube.com/watch?v=2PFUwLe ... JItjYZLN7H

i.komarov
Сообщения: 3
Зарегистрирован: 13 янв 2017, 12:44

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение i.komarov » 13 янв 2017, 13:03

Добрый день, на данный момент использую Loaderы для поддержания жизни презентера во время смены конфигурации (и разрушения соответственно) View-компонентов. Столкнулся с (судя по issue с ругло-групп) решенной в v24 саппорт либы проблемой - при перевороте экрана пересоздается и Loader, если он внутри фрагмента. После обновления до последней на тот момент версии (24.2.1, текущая, на которой я на данный момент разрабатываю) проблема осталась. Не встречались ли Вы с подобной проблемой ?

i.komarov
Сообщения: 3
Зарегистрирован: 13 янв 2017, 12:44

Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader

Сообщение i.komarov » 13 янв 2017, 13:17

postflow писал(а):Верно ли будет утверждение что AsyncTaskLoader выполняется не в UI потоке. По этой причине выполнение длительного сетевого предпочтительней выполнять в нём(а не в Loader) ? Что исключит тормоза с actyvity.

Другими словами AsyncTaskLoader идеально подходит для REST архитектуры. Верно?
Хотел бы обратить ваше внимание на сервисы, поскольку ценность результата длительной задачи весьма вероятно велика, а потому следует избегать повторных запросов в связи с событиями жц Вашего компонента, будь то Activity или Fragment.

Ответить