Урок 135. Loader. LoaderManager. AsyncTaskLoader
Урок 135. Loader. LoaderManager. AsyncTaskLoader
В этом уроке:
- изучаем Loader и AsyncTaskLoader
Click here to read this article!
- изучаем Loader и AsyncTaskLoader
Click here to read this article!
Последний раз редактировалось damager82 28 май 2017, 21:50, всего редактировалось 3 раза.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Спасибо за урок! Вопрос такой-что дает использование лоадеров? Более простое управление потоками? То есть нам самим не надо останавливать при выходе из приложения и тд?!
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Присоединяюсь к вопросу!
Нашел ответ на хабрахабре:
Нашел ответ на хабрахабре:
http://habrahabr.ru/company/eastbanctech/blog/192998/Вы не написали в чём же главное преимущество Loader'ов: их жизненный цикл отвязан от конкретной активности и управляется LoaderManager'ом. Это решает очень распространённую в 2.х проблему: вы начали загрузку чего-то тяжёлого в отдельном потоке (в асинктаске или руками созданном потоке, не суть), а активность пересоздалась (перевернули девайс). Асинтаска в панике — возвращать результат некуда, а вам нужно либо начинать загрузку заново либо придумывать велосипед по сохранению результатов загрузки. Loader'ы полностью решают эту проблему: вы просите у менеджера экземпляр лоадера по идентификатору. Если лоадер не был создан — менеджер его создаст, иначе — отдаст существующий экземпляр. То есть инициировать создание лоадера может одна активность, а получить результат уже совсем другая.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
В методе observerClick(класса MainActivity) используется метод -dispatchChange(false) -depricated in API level 16...
правильно будет так:
dispatchChange(false, null), т.е. просто нужно указать второй параметр(Uri), который в данном случае можно просто передать, как null.
правильно будет так:
dispatchChange(false, null), т.е. просто нужно указать второй параметр(Uri), который в данном случае можно просто передать, как null.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Спасибо за ваши уроки.
В моём 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(...) текущего активити.
Как можно это исправить?
В моём 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
Я что то не понял а зачем нужны Лоадеры если мы все равно используем AsyncTask для асинхронной обработки данных. Или это чисто для примера ты взял?
И в чем тогда отличие от пула потоков и LoaderManager кроме доступа к UI как я понял?
И в чем тогда отличие от пула потоков и LoaderManager кроме доступа к UI как я понял?
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Посоветуйте как лучше реализовать TIMEOUT который дает Loader-у например 5 секунд времени на сетевой запрос, если никакого ответа от сервера нет, то завершает Loader.
Русскоязычный чат Android разработчиков https://gitter.im/rus-speaking/android
-
- Сообщения: 115
- Зарегистрирован: 08 янв 2015, 14:32
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
вот я тоже подозреваю) причём ВСЕХ)McMerphy писал(а):...
Подозреваю, что это происходит из-за того что при выполнении onCreate(...) активити разрушается и создаётся новое, а при getLoaderManager().initLoader(...) лоадеру передаётся уже новый колбэк-объект, который ссылается на текущее созданное активити. Но если loadInBackground() запустился в старом активити, то он не вызывает onLoadFinished(...) текущего активити...
У меня всё таже проблема: Есть запрос/ответ по блютусине. Требуется организовать всё не в основном потоке. Подходов я смотрю миллион. ЧТО КОНКРЕТНО ДЛЯ ЧЕГО ЮЗАТЬ? - вот основной вопрос(((
как победить этот момент я так и не понял: ждём ответа от лоадера - наклонили телефон, неважно что произошло... и вот приходит ответ... куда? как? у меня же новое активити... (((
ну согласитесь, не вариант запрещать поворот экрана(((
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Можно и запретить но! Только на время выполнения задачи. Разница понятна? Подходит в некоторых случаях.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
для этого придумали сервисы.GRAF_COLLIOSTRO писал(а):вот я тоже подозреваю) причём ВСЕХ)McMerphy писал(а):...
Подозреваю, что это происходит из-за того что при выполнении onCreate(...) активити разрушается и создаётся новое, а при getLoaderManager().initLoader(...) лоадеру передаётся уже новый колбэк-объект, который ссылается на текущее созданное активити. Но если loadInBackground() запустился в старом активити, то он не вызывает onLoadFinished(...) текущего активити...
У меня всё таже проблема: Есть запрос/ответ по блютусине. Требуется организовать всё не в основном потоке. Подходов я смотрю миллион. ЧТО КОНКРЕТНО ДЛЯ ЧЕГО ЮЗАТЬ? - вот основной вопрос(((
как победить этот момент я так и не понял: ждём ответа от лоадера - наклонили телефон, неважно что произошло... и вот приходит ответ... куда? как? у меня же новое активити... (((
ну согласитесь, не вариант запрещать поворот экрана(((
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Верно ли будет утверждение что AsyncTaskLoader выполняется не в UI потоке. По этой причине выполнение длительного сетевого предпочтительней выполнять в нём(а не в Loader) ? Что исключит тормоза с actyvity.
Другими словами AsyncTaskLoader идеально подходит для REST архитектуры. Верно?
Другими словами AsyncTaskLoader идеально подходит для REST архитектуры. Верно?
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
они одинаковые, просто а.т.лоадер содержит в себе уже код для выполнения асинхронной задачи. Но оба предназначены для бэкграунд загрузки из базы данных. Для сетевых запросов мало подходит. Посмотри наш последний вебинар, там вначале кратко объясняется почему не подходит, а потом что использовать для асинхронных сетевых задач и дан очень хороший пример.
Для запросов - ретрофит.
Для запросов - ретрофит.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Для тех кто зашел с googl-a: https://www.youtube.com/watch?v=2PFUwLe ... JItjYZLN7HFoenix писал(а):они одинаковые, просто а.т.лоадер содержит в себе уже код для выполнения асинхронной задачи. Но оба предназначены для бэкграунд загрузки из базы данных. Для сетевых запросов мало подходит. Посмотри наш последний вебинар, там вначале кратко объясняется почему не подходит, а потом что использовать для асинхронных сетевых задач и дан очень хороший пример.
Для запросов - ретрофит.
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Добрый день, на данный момент использую Loaderы для поддержания жизни презентера во время смены конфигурации (и разрушения соответственно) View-компонентов. Столкнулся с (судя по issue с ругло-групп) решенной в v24 саппорт либы проблемой - при перевороте экрана пересоздается и Loader, если он внутри фрагмента. После обновления до последней на тот момент версии (24.2.1, текущая, на которой я на данный момент разрабатываю) проблема осталась. Не встречались ли Вы с подобной проблемой ?
Re: Урок 135. Loader. LoaderManager. AsyncTaskLoader
Хотел бы обратить ваше внимание на сервисы, поскольку ценность результата длительной задачи весьма вероятно велика, а потому следует избегать повторных запросов в связи с событиями жц Вашего компонента, будь то Activity или Fragment.postflow писал(а):Верно ли будет утверждение что AsyncTaskLoader выполняется не в UI потоке. По этой причине выполнение длительного сетевого предпочтительней выполнять в нём(а не в Loader) ? Что исключит тормоза с actyvity.
Другими словами AsyncTaskLoader идеально подходит для REST архитектуры. Верно?