Страница 1 из 1
Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 10 ноя 2013, 23:00
damager82
В этом уроке:
- изучаем Loader и AsyncTaskLoader
Click here to read this article!
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 11 ноя 2013, 11:04
hard
Спасибо за урок! Вопрос такой-что дает использование лоадеров? Более простое управление потоками? То есть нам самим не надо останавливать при выходе из приложения и тд?!
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 03 дек 2013, 10:41
Tkas
Присоединяюсь к вопросу!
Нашел ответ на хабрахабре:
Вы не написали в чём же главное преимущество Loader'ов: их жизненный цикл отвязан от конкретной активности и управляется LoaderManager'ом. Это решает очень распространённую в 2.х проблему: вы начали загрузку чего-то тяжёлого в отдельном потоке (в асинктаске или руками созданном потоке, не суть), а активность пересоздалась (перевернули девайс). Асинтаска в панике — возвращать результат некуда, а вам нужно либо начинать загрузку заново либо придумывать велосипед по сохранению результатов загрузки. Loader'ы полностью решают эту проблему: вы просите у менеджера экземпляр лоадера по идентификатору. Если лоадер не был создан — менеджер его создаст, иначе — отдаст существующий экземпляр. То есть инициировать создание лоадера может одна активность, а получить результат уже совсем другая.
http://habrahabr.ru/company/eastbanctech/blog/192998/
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 11 дек 2013, 19:21
altwin
В методе observerClick(класса MainActivity) используется метод -dispatchChange(false) -depricated in API level 16...
правильно будет так:
dispatchChange(false, null), т.е. просто нужно указать второй параметр(Uri), который в данном случае можно просто передать, как null.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 26 дек 2013, 08:01
McMerphy
Спасибо за ваши уроки.
В моём 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(...) текущего активити.
Как можно это исправить?
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 01 мар 2014, 01:22
MeTeOpA
Я что то не понял а зачем нужны Лоадеры если мы все равно используем AsyncTask для асинхронной обработки данных. Или это чисто для примера ты взял?
И в чем тогда отличие от пула потоков и LoaderManager кроме доступа к UI как я понял?
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 30 окт 2014, 16:47
Atetc
Посоветуйте как лучше реализовать TIMEOUT который дает Loader-у например 5 секунд времени на сетевой запрос, если никакого ответа от сервера нет, то завершает Loader.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 24 фев 2015, 11:56
GRAF_COLLIOSTRO
McMerphy писал(а):...
Подозреваю, что это происходит из-за того что при выполнении onCreate(...) активити разрушается и создаётся новое, а при getLoaderManager().initLoader(...) лоадеру передаётся уже новый колбэк-объект, который ссылается на текущее созданное активити. Но если loadInBackground() запустился в старом активити, то он не вызывает onLoadFinished(...) текущего активити...
вот я тоже подозреваю) причём ВСЕХ)
У меня всё таже проблема: Есть запрос/ответ по блютусине. Требуется организовать всё не в основном потоке. Подходов я смотрю миллион. ЧТО КОНКРЕТНО ДЛЯ ЧЕГО ЮЗАТЬ? - вот основной вопрос(((
как победить этот момент я так и не понял: ждём ответа от лоадера - наклонили телефон, неважно что произошло... и вот приходит ответ... куда? как? у меня же новое активити... (((
ну согласитесь, не вариант запрещать поворот экрана(((
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 24 фев 2015, 12:24
Foenix
Можно и запретить но! Только на время выполнения задачи. Разница понятна? Подходит в некоторых случаях.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 24 фев 2015, 12:25
altwin
GRAF_COLLIOSTRO писал(а):McMerphy писал(а):...
Подозреваю, что это происходит из-за того что при выполнении onCreate(...) активити разрушается и создаётся новое, а при getLoaderManager().initLoader(...) лоадеру передаётся уже новый колбэк-объект, который ссылается на текущее созданное активити. Но если loadInBackground() запустился в старом активити, то он не вызывает onLoadFinished(...) текущего активити...
вот я тоже подозреваю) причём ВСЕХ)
У меня всё таже проблема: Есть запрос/ответ по блютусине. Требуется организовать всё не в основном потоке. Подходов я смотрю миллион. ЧТО КОНКРЕТНО ДЛЯ ЧЕГО ЮЗАТЬ? - вот основной вопрос(((
как победить этот момент я так и не понял: ждём ответа от лоадера - наклонили телефон, неважно что произошло... и вот приходит ответ... куда? как? у меня же новое активити... (((
ну согласитесь, не вариант запрещать поворот экрана(((
для этого придумали сервисы.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 05 май 2016, 14:28
postflow
Верно ли будет утверждение что AsyncTaskLoader выполняется не в UI потоке. По этой причине выполнение длительного сетевого предпочтительней выполнять в нём(а не в Loader) ? Что исключит тормоза с actyvity.
Другими словами AsyncTaskLoader идеально подходит для REST архитектуры. Верно?
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 05 май 2016, 19:03
Foenix
они одинаковые, просто а.т.лоадер содержит в себе уже код для выполнения асинхронной задачи. Но оба предназначены для бэкграунд загрузки из базы данных. Для сетевых запросов мало подходит. Посмотри наш последний вебинар, там вначале кратко объясняется почему не подходит, а потом что использовать для асинхронных сетевых задач и дан очень хороший пример.
Для запросов - ретрофит.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 06 май 2016, 10:54
postflow
Foenix писал(а):они одинаковые, просто а.т.лоадер содержит в себе уже код для выполнения асинхронной задачи. Но оба предназначены для бэкграунд загрузки из базы данных. Для сетевых запросов мало подходит. Посмотри наш последний вебинар, там вначале кратко объясняется почему не подходит, а потом что использовать для асинхронных сетевых задач и дан очень хороший пример.
Для запросов - ретрофит.
Для тех кто зашел с googl-a:
https://www.youtube.com/watch?v=2PFUwLe ... JItjYZLN7H
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 13 янв 2017, 13:03
i.komarov
Добрый день, на данный момент использую Loaderы для поддержания жизни презентера во время смены конфигурации (и разрушения соответственно) View-компонентов. Столкнулся с (судя по issue с ругло-групп) решенной в v24 саппорт либы проблемой - при перевороте экрана пересоздается и Loader, если он внутри фрагмента. После обновления до последней на тот момент версии (24.2.1, текущая, на которой я на данный момент разрабатываю) проблема осталась. Не встречались ли Вы с подобной проблемой ?
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добавлено: 13 янв 2017, 13:17
i.komarov
postflow писал(а):Верно ли будет утверждение что AsyncTaskLoader выполняется не в UI потоке. По этой причине выполнение длительного сетевого предпочтительней выполнять в нём(а не в Loader) ? Что исключит тормоза с actyvity.
Другими словами AsyncTaskLoader идеально подходит для REST архитектуры. Верно?
Хотел бы обратить ваше внимание на сервисы, поскольку ценность результата длительной задачи весьма вероятно велика, а потому следует избегать повторных запросов в связи с событиями жц Вашего компонента, будь то Activity или Fragment.