2012-03-02 2 views
5

В прошлом изменения ориентации и AsyncTask (и другие длинные фоновые задачи) не играли хорошо друг с другом. Всегда существовала проблема знать, какие задачи (или потоки) все еще выполняются во вновь созданной деятельности (от изменения ориентации) и что делать, когда задача заканчивается, пока действие не подключено.Android, AsyncTask, длительные процессы и изменения ориентации

Даже с Фрагментами и LoaderManager это все еще кажется проблемой для меня.

Каким будет предпочтительный способ в наши дни, для управления произвольными длительными задачами и изменениями ориентации? Чтобы узнать, какие задачи выполняются во вновь созданной работе. Чтобы убедиться, что задача не пытается доставить ее информацию, когда активность не подключена.

Спасибо

+2

Я предлагаю вам переписать свой вопрос, заменив слово «процесс» в местах, где вы на самом деле не имеете в виду «процесс», а вместо этого означает что-то другое. Процесс ОС имеет очень специфическое определение, из-за чего ваш вопрос имеет мало смысла (например, процессы не доставляют информацию, а действия не создают процессы). – CommonsWare

ответ

4

В моей программе я просто положил

android:configChanges="orientation|keyboardHidden|keyboard" 

в моей деятельности в манифесте и сделать с ней. Через 1 год у меня было 0 проблем.

+0

Как вы переходите на обработку изменений конфигурации самостоятельно? – synic

+0

Я обнаружил, что наличие в манифесте заставляет деятельность не воссоздавать, тем самым решая все ваши проблемы. Я собирался сам разобраться с этим, но на практике это оказалось ненужным. Он работает так, как вы ожидаете/хотите. – Pyrodante

+0

Ничего себе. Я всегда отвлекался от этого, потому что он казался более сложным, чем я хотел. Вы правы, я работаю так, как хочу. – synic

-1

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

Это довольно широкий вопрос.

+1

Я не думаю, что это проблема, которую должны решить Сервисы. Похоже, что если ваше приложение не имеет задач, оно не зависит от жизненного цикла вашей деятельности, Служба просто будет пустой тратой ресурсов. – synic

0

Как и другие сообщения, вы можете использовать android: configChanges = xxx.

НО, это не всегда желательно. Android предназначен для того, чтобы убивать активность при изменении конфигурации и создавать новые, и вы можете воспользоваться этим в некоторой ситуации, предоставив альтернативный макет экрана. Это имеет смысл, например, в приложении с несколькими панелями, где ландшафтная ориентация показывает разные виды, чем ориентация на портрет.

Итак, чтобы вернуться к вашему вопросу: я не читал о предпочтительном способе обработки длительных операций, но из собственного опыта я предлагаю хранить такую ​​задачу в состоянии постоянной активности (сохраняется/восстанавливается в onRetainNonConfigurationInstance/onCreate) , или с использованием постоянных фрагментов.

Если ваша активность обнаруживает, что какая-то задача уже запущена, она может дать возможность воссоздать диалог, чтобы показать его прогресс.

И обратите внимание: изменение регистрации не является единственным, что может сделать вашу деятельность воссозданной. Будьте готовы к изменению языка, стыковке и другим возможностям :) Но все же изменение ориентации является наиболее распространенным.

+0

У стойких фрагментов все еще есть возможность попытаться доставить результаты, когда активность не подключена. onRetainNonConfigurationInstance не может хранить, скажем, активное сетевое соединение. Проблема здесь заключается не в сохранении состояния для изменения конфигурации, а в том, что данные не доставляются, когда активность не подключена, или что она не пытается доставить ее до мертвой активности – synic

Смежные вопросы