2016-12-31 8 views
1

Я видел некоторые публикации на эту тему, но ни один из них не имеет удовлетворительных ответов.Как долго длится рабочий стол Android?

Предположим, что я начал рабочий поток из моего основного (одного и того же) Activity в своем методе onCreate(). Затем я вызываю finish(), чтобы вызвать завершение операции Activity.

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

Предполагая, что это правильно - когда рабочая нить убита? Это только убито, когда система активно разрушает процесс?

В моем случае мой рабочий поток существует как слушатель для подключения Bluetooth; когда он получен, он снова запустит желаемый Activity. В этой ситуации активно не работает компонент (Activity, Service, ContentProvider или BroadcastReceiver). Мне кажется, что это должно сработать, за исключением того, что что-то убивает мою рабочую нить.

Я знаю, что мог бы сделать это (и с меньшей болью), используя фон Service. Однако мне интересно, почему это не работает.

Спасибо, Barry

+0

Я считаю, что поток будет уничтожен автоматически, только когда процесс Linux будет уничтожен. – Enzokie

+0

_ «Мне кажется, что это должно сработать, за исключением того, что что-то убивает мой рабочий поток». Это может означать, что [система завершила процесс приложения] (http://stackoverflow.com/questions/34463069/can-android -kill-мое-приложение-то время-это-это-в-среднего уровня с петлями-исполнение). _ «Это только убито, когда система активно разрушает процесс?» _ Исправить (или если метод 'run()' возвращает). – Onik

+0

Согласовано. Тогда возникает вопрос, когда этот процесс убит? Я предполагаю, что он убит, когда нет более запущенных компонентов, но я не видел, чтобы это явно документировано где угодно. Подробнее в ответе на ответ «BroadcastReceiver» Олега, ниже. –

ответ

0

Android App lifecycle имеет хороший пример, который очень по теме:

Типичным примером ошибки процесса жизненного цикла является BroadcastReceiver , который запускает поток, когда он получает Intent в BroadcastReceiver.onReceive(), а затем возвращается из функции . Как только он вернется, система считает, что BroadcastReceiver перестает быть активным, и поэтому его хостинг-процесс больше не нужен (если в нем не задействованы другие компоненты приложения). Таким образом, система может убить процесс в любое время, чтобы восстановить память, и при этом завершает порожденный поток, запущенный в этом процессе.

Короче говоря, на самом деле это не очень предсказуемо, если у вас есть шанс запустить до тех пор, пока окончание или процесс не будут убиты заранее, вы НЕ должны определенно полагаться на какой-либо порядок/поведение.

Стоит отдельно упомянуть, что ее довольно легко leak ваша деятельность вместе с нитью, даже если вы закончите() это, но если это ваша последняя/единственная деятельность, это не меняет картину

+0

Он только теряет активность, если у Activity есть ссылка на него. Если его Thread не ссылается на Activity каким-либо образом и является либо статическим внутренним классом, либо не внутренним классом, утечка активности отсутствует, а только ссылки, которые имеет класс Thread. –

+0

ему не нужно иметь явную ссылку, достаточно сказать новую тему() {...} в onCreate, чтобы получить неявные ссылки и стрелу –

+0

Нет, это не так. Это верно, только если поток является нестационарным внутренним классом.Какой ваш пример (нестатический анонимный внутренний класс), но не обязательно. Статические внутренние классы не имеют ссылки на родительский класс. –

-1

Существует один главный (называемый также UI) поток в Android. Это единственная тема, которую использует ваше приложение, если она не запускается явно через Thread.start(), AsyncTask.execute() и т. Д. Все действия, службы, BroadcastReceivers и т. Д. Запускают все их методы жизненного цикла в этом основном потоке. Обратите внимание, что я включил Службы - Служба работает в основном потоке, если только она не запускает собственный поток (исключение составляет IntentService, который запускается на собственной теме).

A Thread, который вы создаете, продолжается до тех пор, пока Runnable не примет его функцию возврата (или, конечно же, процесс завершен). Это может жить до конца Activity/Service, он был создан. Однако такой поток по-прежнему будет находиться в исходном экземпляре компонента и не сможет получить доступ к переменным нового экземпляра, если он был перезапущен без особых специальных действий (см. Рисунок Loader).

+0

где автор упоминал что-либо, что противоречит вашему утверждению? он просто породил нить из onCreate –

+0

Исправление Основная тема ** иногда ** называется потоком пользовательского интерфейса. – Enzokie

+0

@OlegBogdanov Я изначально неправильно понял его вопрос, поскольку мышление onCreate запустило нить. Я удалил тебя, ты ошибаешься. –

0

При запуске нить, он не зависит от родителя, который его начал. В вашем случае это ваша заявка. Это означает, что до тех пор, пока метод Run не будет полностью выполнен, ваш поток будет жить.

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

Поскольку вы упомянули о том, что вы создали прослушиватель для прослушивания Bluetooth-соединения, ваш поток, вероятно, умирает до того, как он получит какое-либо событие (для меня невозможно знать без фрагмента кода). Также может произойти сбой, который завершит поток.

+0

Утечка памяти происходит только тогда, когда Thread имеет ссылку Activity. – Enzokie

+0

В потоке могут содержаться ссылки на вещи, отличные от активности, которые могут вызвать утечку упомянутой ссылки. –

+0

Пояснение: I * хочу, чтобы рабочий поток продолжал существовать, и я стараюсь не генерировать никаких новых после этого. По идее, по крайней мере, это позволило бы принимать входящие запросы Bluetooth и запускать соответствующий Activity, когда это произойдет. Таким образом, не будет утечки памяти (пока я правильно программирую рабочий поток) - просто память, которую я намерен сохранить для целей рабочего потока. –

1

Когда рабочая нить убита? Это только убито, когда система активно разрушает процесс?

-> рабочая нить квалифицирована после всего ее кода в run Выполненная функция. Он все еще работает, даже когда ваш activity уничтожен.

В моем случае мой рабочий поток существует как слушатель для соединения Bluetooth; когда он будет получен, он снова запустит желаемую активность. В этой ситуации активно не работает компонент (Activity, Service, ContentProvider или BroadcastReceiver). Мне кажется, что это должно сработать, за исключением того, что что-то убивает мою рабочую нить.

Чтобы сделать это работает, Вы должны иметь опыт service в этом случае и сделать soft/weak ссылку на ваш service с вашего рабочего потока или более простым, используя EventBus начать любой компонент из Service как: