Task, Async Task, Loader, Service

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Task, Async Task, Loader, Service

Сообщение Fry » 29 янв 2014, 12:19

Эти технологии (кроме Task и Async Task) не являются родственниками, однако они "конкурируют" в случаях, когда необходимо вывести какую-либо задачу из потока UI.

Потому возникает вопрос - что в каком случае лучше использовать?

Если есть ссылки на хорошие материалы - буду признателен.
Arbeit macht Fry

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

Re: Task, Async Task, Loader, Service

Сообщение altwin » 29 янв 2014, 13:44

Fry писал(а):Эти технологии (кроме Task и Async Task) не являются родственниками, однако они "конкурируют" в случаях, когда необходимо вывести какую-либо задачу из потока UI. .
И откуда такая информация? Loader и AsyncTask вообще ничем не похожи и конкурируют они в голове того, кто о них думает только по причине не понимания задачи. они по сути дополняют друг друга. Service -это вообще из другой оперы -это процесс выполняющийся паралельно с приложением и не зависящий от его состояния. То, что они все могут использоваться для выполнения одной задачи ничем их не объединяет, просто есть разные способы решения.
Вам стоит разобраться с структурой самого android, какие существуют уровни, и на каком уровне работает сам android framework, ваше приложение не существует отдельно, оно живет в инфраструтктуре системы и является простым процессом, тот же service по сути создает новый процесс, а вот AsyncTask в контексте системы - задачу внутри процесса. Опять же Loader и AsyncTask объеденены в AsyncTaskLoader, в котором по сути реализован курсор работающий с AsyncTask по аналогии, как привычный курсор работает с базой.

Я не знаю как это можно объяснить, к тому же не все детали знаю... тут нужно гораздо более глубокое понимание жизни приложения в системе.
1. Service - это долгоживущие фоновые задачи
2. Loader и AsyncTask - для выполнения кода асинхронно/ в другом потоке, но у них абсолютно разный жизненый цикл, тот же Loader привязан с Activity/Fragments, когда AsyncTask имеет состояния, "начался" и "закончился" и все. Опять же Loader не нуждается в Handler поскольку привязан к стеку activity.

В общем по русски написать я так и не смог :) -это вообще разные вещи работающие принципиально по разному, а что использовать - зависит от стиля программирования и архитектуры конкретного решения.
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Task, Async Task, Loader, Service

Сообщение Mikhail_dev » 29 янв 2014, 13:49

Service -это вообще из другой оперы -это процесс выполняющийся паралельно с приложением и не зависящий от его состояния.
тот же service по сути создает новый процесс
Неверно. Если в манифесте стоит сервису параметр :remote , то только тогда, он будет создан в отдельном процессе. Если не стоит, то он будет создан в потоке UI.

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

Re: Task, Async Task, Loader, Service

Сообщение altwin » 29 янв 2014, 13:57

m090050 писал(а):
Service -это вообще из другой оперы -это процесс выполняющийся паралельно с приложением и не зависящий от его состояния.
тот же service по сути создает новый процесс
Неверно. Если в манифесте стоит сервису параметр :remote , то только тогда, он будет создан в отдельном процессе. Если не стоит, то он будет создан в потоке UI.
правильно, просто торопясь я написал наоборот, естественно, что AsyncTask запускающий поток работает в другом процессе(я писал иначе), а сервис никогда не создает другой поток(да пока это не указанно) а наоборот аналагичен задаче. Тут важен другой момент, не важно где запущен сервис - он не должен и не взаимодействует с пользователем.
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Task, Async Task, Loader, Service

Сообщение anber » 29 янв 2014, 14:03

Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Task, Async Task, Loader, Service

Сообщение KamiSempai » 29 янв 2014, 14:07

Не припомню такого класса как Task. Возможно вы имели ввиду TimerTask?
Если так то добавлю еще кое что к выше сказанному:
TimerTask - выполняет задачу в отдельном потоке в определенное время либо с указанной периодичностью, для выполнения используется пулл потоков. Чем-то похож на Handler только тот выполняет задачи в одном конкретном потоке.
AsyncTask - выполняет задачу в отдельном потоке, также производит это в пуле потоков, в отличии от TimerTask не может делать это в заданное время. Однако имеет специальные методы выполняемые в UI потоке, благодаря чему не нужно самостоятельно об этом заботиться. А еще AsyncTask может хранить результат в виде объекта.
Loader - как и говорилось, не конкурируют с вышеперечисленными классами. Главной особенностью лоадеров является то, что после загрузки они продолжают поддерживать загруженный объект и в случае изменений обновляют его автоматически. Одним из наглядных примеров является связка CursorLoader и ContentProvider, в этом случае не нужно заботиться об обновлении курсора, все происходит автоматически.

Про сервис добавить нечего, он вообще из другой компании.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Task, Async Task, Loader, Service

Сообщение Fry » 29 янв 2014, 14:23

KamiSempai писал(а):Не припомню такого класса как Task..
Сори, ошибся. Я имел в виду Thread + Handler.
Loader - как и говорилось, не конкурируют с вышеперечисленными классами. Главной особенностью лоадеров является то, что после загрузки они продолжают поддерживать загруженный объект и в случае изменений обновляют его автоматически.
Давайте на примерах.

В чем бы вы реализовали соединение с использованием HttpURLConnection с последующим распарсиванием XML/Json? Результаты возвращаются во фрагмент.

Я это делаю в асинхронном потоке, но возникли сомнения, правильно ли это.
Arbeit macht Fry

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Task, Async Task, Loader, Service

Сообщение anber » 29 янв 2014, 14:49

Fry писал(а):
KamiSempai писал(а):Не припомню такого класса как Task..
Сори, ошибся. Я имел в виду Thread + Handler.
посмотри исходники AsyncTask - это и есть обертка над Thread + Handler

Fry писал(а): В чем бы вы реализовали соединение с использованием HttpURLConnection с последующим распарсиванием XML/Json? Результаты возвращаются во фрагмент.
Я бы реализовал это в Volley ^^
см. http://habrahabr.ru/post/188860/
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

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

Re: Task, Async Task, Loader, Service

Сообщение altwin » 29 янв 2014, 14:52

Fry писал(а):
Давайте на примерах.

В чем бы вы реализовали соединение с использованием HttpURLConnection с последующим распарсиванием XML/Json? Результаты возвращаются во фрагмент.

Я это делаю в асинхронном потоке, но возникли сомнения, правильно ли это.
Давайте не будем в 100 -ый раз повторять одно и то же. Существуют тысячи строк кода от google/Apache и т.д. демонстрирующие как оно работает. Можно посмотреть к примеру очень популярную библиотеку: http://square.github.io/retrofit/, можно изучить, как это делает google: https://github.com/android, можно посмотреть на другую реализацию: https://github.com/vgevorgyan/android-async-new-http или: https://code.google.com/p/basic-http-client/

Суть простая, ваша задача - отправить запрос, получить ответ, разобрать, что кроме AsyncTask вы можете использовать? Зачем?
Изображение

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

Re: Task, Async Task, Loader, Service

Сообщение altwin » 29 янв 2014, 14:54

anber писал(а): Я бы реализовал это в Volley ^^
см. http://habrahabr.ru/post/188860/
а мне retrofit больше нравится... лучше бы конечно AndroidAnotation, но оно в rest вусь spring тянет :( вот хочу попробывать расхваленный: http://droidparts.org/
Изображение

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

Re: Task, Async Task, Loader, Service

Сообщение altwin » 29 янв 2014, 15:02

[ОФФТОП]меня если честно очень часто вводят в ступор подобные решения и вопросы возникающие при решении задач разработки под Android ...И все больше начинаю "любить" iOS, который так не нравился "забитыми" стандартами... а еще больше, когда вижу, как иногда не просто пролезть в AppStore глядя на то, что творится в google play.... Там все просто, есть принятый стандарт юзабилити и типовые layout - не соотвествуешь == вали :) Есть огромные ресурсы кода от apple и вообще не возникает вопросов или желания искать что то другое на github...
Последний раз редактировалось altwin 29 янв 2014, 15:03, всего редактировалось 1 раз.
Изображение

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Task, Async Task, Loader, Service

Сообщение Fry » 29 янв 2014, 15:03

То есть советуете стороннюю либу использоваться?..

А что по поводу Robospice https://github.com/octo-online/robospice скажите?
Arbeit macht Fry

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

Re: Task, Async Task, Loader, Service

Сообщение altwin » 29 янв 2014, 15:06

Fry писал(а):То есть советуете стороннюю либу использоваться?..

А что по поводу Robospice https://github.com/octo-online/robospice скажите?
для начала можно просто посмотреть, как они это делают. Я ей не пользовался но суть у них всех одна, просто по разному классы называются и часто разный функционал, тот же DroidParts помимо работы с rest умеет еще очень много всего и весит очень мало.
Кстати Robospice похоже тоже spring android использует для разбора json и перегоня в POJO, но вообще подробно не смотрел на него, что то не впечатлил :)
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Task, Async Task, Loader, Service

Сообщение anber » 29 янв 2014, 16:12

Fry писал(а):То есть советуете стороннюю либу использоваться?..

А что по поводу Robospice https://github.com/octo-online/robospice скажите?
Вопрос стоял так "В чем бы вы реализовали соединение?".
Вообще несколько недальновидно реализовывать соединение с помощью сторонней либы не зная как работают стандартные средства, не правда ли?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Task, Async Task, Loader, Service

Сообщение Fry » 29 янв 2014, 16:20

anber, та ты же сам либу в ответ посоветовал. )

Я хочу сначала разобраться с технологиями, а затем узнать, что лучше всего использовать, чтобы каждый раз не использовать велосипед для типовых задач.
Arbeit macht Fry

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Task, Async Task, Loader, Service

Сообщение anber » 29 янв 2014, 16:23

Fry писал(а):anber, та ты же сам либу в ответ посоветовал. )

Я хочу сначала разобраться с технологиями, а затем узнать, что лучше всего использовать, чтобы каждый раз не использовать велосипед для типовых задач.
Либа хорошая, да. Но все-таки, прочитай мой предыдущий пост.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Task, Async Task, Loader, Service

Сообщение anber » 29 янв 2014, 16:34

Расскажу маленькую историю.
Решил разработчик Джо сделать приложение, и думает что выбрать:
AcyncTask простая до безобразия, там что-то сломать очень тяжело, но придется переутомиться и написать 3-4 лишних сточки кода.
Поэтому решил Джо заюзать чудную либу, которая делает все сама.
Сделали проект, проетстировали, отметили релиз, отправляют заказчику - и оказывается что на реальном сервера она выдает неправильный результат и хрен его знает почему. Либа сложная и хрен в ней разберешься что там не работает, может объявили неправильно, может флаг какой-нибудь не указали.
А заказчик злится, требует чтоб исправили и быстро, грозит уволить.
И сидит наш Джо, седеет над этой чудной либой и матерится - времени чтоб все поменять на простой и понятный AcyncTask нету, как исправить неизвестно, остается только медитировать над кодом в надежде что он придумает какой-нибудь костыль который заставит эту чортову либу работать, в очередной раз отстрочить срок у заказчика "на завтра", и забухать.
Последний раз редактировалось anber 29 янв 2014, 18:36, всего редактировалось 2 раза.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Task, Async Task, Loader, Service

Сообщение KamiSempai » 29 янв 2014, 17:32

Какая печальная история :)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Task, Async Task, Loader, Service

Сообщение rezak90 » 29 янв 2014, 17:36

anber
Как я тебя понимаю, проходили такое уже =)
R.id.team
Политика на форуме запрещена

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

Re: Task, Async Task, Loader, Service

Сообщение altwin » 30 янв 2014, 12:09

вот вот, новичек часто выбирает стороннюю библиотеку лишь потому, что там уже все "красиво", а как сделать такое самому не знаю, и это проблема... На сколько я заметил для себя написать что то самому, пусть и очень сложное, предварительно потратив неделю на research на много легче, чем разобраться в чужом коде. Особенно когда, как бывает в 80% случаев, этот "чужой" сам не до конца понимает, что сделал и большую часть решений взял со stackoverflow.

P.S. наверно стоит заметить, что не совсем "новичку" пришедшему из мира web разработки стоит в первую очередь понять, что использование в проекте java библиотеки - это не то же самое, что подключение плагина из jQuery. java - это строго типизированный язык, тут нельзя работать по принципу "не важно как оно работает, главное, что работает", когда завтра оно работать не захочет, с таким подходом вы будете абсолютно беззащитны.
Изображение

Ответить