Урок 91. AsyncTask. Поворот экрана
Re: Урок 91. AsyncTask. Поворот экрана
Есть способ сделать так, чтобы AsyncTask запускался из одного активити, а данные возвращал в другой?
Можно ли сделать так, чтобы AsyncTask не привязывался к тому активити, из которого был запущен, в том числе в ситуации, когда запустившее активити уничтожается?
Можно ли сделать так, чтобы AsyncTask не привязывался к тому активити, из которого был запущен, в том числе в ситуации, когда запустившее активити уничтожается?
Arbeit macht Fry
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Самый безопасный способ - это запускать задачу в сервисе, и передавать полученные данныев Activity любым удобным способом (биндинг, броадкасты, или еще что).Fry писал(а):Есть способ сделать так, чтобы AsyncTask запускался из одного активити, а данные возвращал в другой?
Можно ли сделать так, чтобы AsyncTask не привязывался к тому активити, из которого был запущен, в том числе в ситуации, когда запустившее активити уничтожается?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
KamiSempai, спасибо, я в курсе по поводу сервисов.
Но интересует, можно ли это сделать на ассин тасках.
Но интересует, можно ли это сделать на ассин тасках.
Arbeit macht Fry
Re: Урок 91. AsyncTask. Поворот экрана
нельзя. Делай на фрагментах, тогда все будет запускаться и ловиться 1-й активити, а данные брать или доставлять результат можно любому фрагменту.
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
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Так это и делается на асинк тасках, только в сервисе.Fry писал(а):KamiSempai, спасибо, я в курсе по поводу сервисов.
Но интересует, можно ли это сделать на ассин тасках.
Можно сделать проще. После завершения работы асинктаска слать броадкаст при помощи LocalBroadcastManager. Тогда всякий кто подписался на это событие получит уведомление. Но этот метод не на все 100% рабочий (я бы даже сказал не на все 90% ). При отправлении телефона в спячку, может случиться все что угодно. Но если это не критично, или задача длится не более нескольких секунд можно сделать и таким способом.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
Но если уж мы делаем сервис, тогда зачем городить ассинк таск в нем? Он же и так умеет работать в отдельном потоке от GUI.Так это и делается на асинк тасках, только в сервисе.
Arbeit macht Fry
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Я вас разочарую. Почти все методы сервиса выполняются в UI потоке.Fry писал(а):Но если уж мы делаем сервис, тогда зачем городить ассинк таск в нем? Он же и так умеет работать в отдельном потоке от GUI.Так это и делается на асинк тасках, только в сервисе.
Если не верите, попробуйте подключиться к интернету в onStartCommand, получите NetworkOnMainThreadException.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
Я хотел сказать, что ведь есть штатные способы сделать сервис отдельным потоком. Так зачем городить огород и запускать в самом сервис асинк таск?KamiSempai писал(а):Я вас разочарую. Почти все методы сервиса выполняются в UI потоке.
Arbeit macht Fry
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Можно об этом по подробнее?Fry писал(а):Я хотел сказать, что ведь есть штатные способы сделать сервис отдельным потоком. Так зачем городить огород и запускать в самом сервис асинк таск?
Я знаю, можно запустить сервис в отдельном процессе, но даже в этом случае он будет работать в UI потоке.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
Упс, а вот этого я не знал...KamiSempai писал(а): Я знаю, можно запустить сервис в отдельном процессе, но даже в этом случае он будет работать в UI потоке.
А почему так было сделано? Почему поток в сервисе (даже когда он отдельный) работает в UI?
Arbeit macht Fry
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Что бы сервис имел доступ к UI компонентам, таким как Toast или Notification. Сами подумайте, вот работает у вас сервис в одиночку, без каких либо активностей, и нужно показать Toast. Как это сделать, если нет доступа к UI?Fry писал(а):Упс, а вот этого я не знал...KamiSempai писал(а): Я знаю, можно запустить сервис в отдельном процессе, но даже в этом случае он будет работать в UI потоке.
А почему так было сделано? Почему поток в сервисе (даже когда он отдельный) работает в UI?
(На самом деле предназначение сервиса не отдельный поток, а создание некоторой сущности, которая представляет из себя важную часть приложения, содержащая контекст приложения, и не дающая этому приложению завершить свою работу)
А в запуске отдельного потока не вижу проблем, несколько строк кода и готово. Для этого можно тот же AsyncTask использовать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
Таааак. Погодите
Я тут столкнулся со следующим поведением. Вот запускаю сервис с "тяжелой" задачей TimeUnit.SECONDS.sleep(10). В Активити у меня крутится ProgressBar.
Так вот. Если процесс работает в том же потоке, что и активити, ProgressBar при работе сервиса замирает (значит GUi загружен). А когда я выделяю процесс в отдельный поток, через запись в манифесте android:process=":newproc", ProgressBar при работе сервиса продолжает крутится.
Более того, делаю TimeUnit.SECONDS.sleep(100), все отрабатывает нормально - Exception не вылетает.
Почему так? Если даже работая в отдельном потоке, сервис работает в GUi-потоке, то ProgressBar должен же замереть. Разве нет?
И если "тяжелые" задачи без проблем крутятся в сервисе, созданном в отдельном потоке, то мы опять возвращаемся к вопросу о необходимости создавать AsyncTask в нем.
Я тут столкнулся со следующим поведением. Вот запускаю сервис с "тяжелой" задачей TimeUnit.SECONDS.sleep(10). В Активити у меня крутится ProgressBar.
Так вот. Если процесс работает в том же потоке, что и активити, ProgressBar при работе сервиса замирает (значит GUi загружен). А когда я выделяю процесс в отдельный поток, через запись в манифесте android:process=":newproc", ProgressBar при работе сервиса продолжает крутится.
Более того, делаю TimeUnit.SECONDS.sleep(100), все отрабатывает нормально - Exception не вылетает.
Почему так? Если даже работая в отдельном потоке, сервис работает в GUi-потоке, то ProgressBar должен же замереть. Разве нет?
И если "тяжелые" задачи без проблем крутятся в сервисе, созданном в отдельном потоке, то мы опять возвращаемся к вопросу о необходимости создавать AsyncTask в нем.
Arbeit macht Fry
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 91. AsyncTask. Поворот экрана
Отдельный процесс = отдельный процесс, который имеет отдельные потоки, отчего следует что он никак не связан с UI.Я знаю, можно запустить сервис в отдельном процессе, но даже в этом случае он будет работать в UI потоке.
Вы наверное хотели сказать в отдельном процессе. В общем отдельный процесс - это отдельная копия виртуальной машины Dalvik (не совсем полная копия, но в инете зачастую говорят именно так). Запуская отдельный процесс, вы можете получить проблему того, что к примеру область памяти для статик ссылок и singleton объектов будет разная, а это значит что синглтонов и всего остального, что вы сделали как одним объектом для всего приложения, будет несколько.Почему так? Если даже работая в отдельном потоке, сервис работает в GUi-потоке, то ProgressBar должен же замереть. Разве нет?
Вдобавок скажу. Что будет, если ваш UI словит ошибку и упадёт? А у вас к примеру сервис с remote: фалгом. Да умрёт только процесс самого UI, а вот процесс сервиса не умрёт, ибо они независимо живут.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Предлагаю следующий эксперимент. Запустить сервис в отдельном процессе, из него запустить активити с прогресс баром и тут-же усыпить основной поток на несколько секунд.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 91. AsyncTask. Поворот экрана
Я слабо понял что ты хочешь сделать. Но зачем тебе эксперименты? Поверь лучше просто мне. Я уже три года работаю с удалёнными процессами, а также тут статейки писал о проблемах процессов
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 91. AsyncTask. Поворот экрана
Так я не тебе предлагаю, а FryMikhail_dev писал(а):Я слабо понял что ты хочешь сделать. Но зачем тебе эксперименты? Поверь лучше просто мне. Я уже три года работаю с удалёнными процессами, а также тут статейки писал о проблемах процессов
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 91. AsyncTask. Поворот экрана
Если он никак не связан с UI, тогда как он имеет доступ к нотификейшенам, например?Отдельный процесс = отдельный процесс, который имеет отдельные потоки, отчего следует что он никак не связан с UI.
И еще вопрос для моего понимания.
Насколько я знаю, процессы состоят из потоков.
Означает ли это, что два разных процесса, например активити и сервис в отдельном процессе, имеют каждый свой GUI поток?
Я правильно понимаю, что если мы создаем отдельный поток в Service (чтобы избежать перекрытие GUI) + используем тот же процесс, что и все приложение, то мы избегаем тех проблем, о которых вы написали?Запуская отдельный процесс, вы можете получить проблему того, что к примеру область памяти для статик ссылок и singleton объектов будет разная, а это значит что синглтонов и всего остального, что вы сделали как одним объектом для всего приложения, будет несколько.
Это я просто для себя пытаюсь понять преимущества и недостатки выделения Service в отдельный процесс.
Есть еще какие-то различия (один процесс/отдельный процесс) для Service?
Есть ли отличая в жизненном цикле, относительно приложения?
Arbeit macht Fry
Re: Урок 91. AsyncTask. Поворот экрана
Мое понимание, когда нужно использовать сервис в отдельном процессе:
1) К сервису могут обращается несколько приложений
2) В сервисе выполняется долгоживущая задача, кушающая много памяти (память под процесс выделится отдельно)
Т.е. в большинстве случаев это не нужно. И самый, на мой взгляд, большой недостаток такого сервиса - это сложность реализации коммуникаций с ним.
1) К сервису могут обращается несколько приложений
2) В сервисе выполняется долгоживущая задача, кушающая много памяти (память под процесс выделится отдельно)
Т.е. в большинстве случаев это не нужно. И самый, на мой взгляд, большой недостаток такого сервиса - это сложность реализации коммуникаций с ним.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 91. AsyncTask. Поворот экрана
А собственно как нотификейшн связан с UI, кроме того, что он может открыть какую-то активность?Если он никак не связан с UI, тогда как он имеет доступ к нотификейшенам, например?
UI поток = обычный поток. Его просто назвали UI потоком. Он ничем не отличается от других. Я так понимаю там жестко прописали мол если с рутового потока запускать сетевую задачу, то писать что "NetworkOnMainThreadException". Так что да, сервисы имеют разные потоки. А GUI потоков не существует.Означает ли это, что два разных процесса, например активити и сервис в отдельном процессе, имеют каждый свой GUI поток?
Да. Используйте IntentService, он запускает задачи в отдельном потоке (не процессе).Я правильно понимаю, что если мы создаем отдельный поток в Service (чтобы избежать перекрытие GUI) + используем тот же процесс, что и все приложение, то мы избегаем тех проблем, о которых вы написали?
Это не совсем прозрачная тема. Первое - это то, что памяти выделяется больше (столько же, сколько и для нового приложения).Это я просто для себя пытаюсь понять преимущества и недостатки выделения Service в отдельный процесс.