Фоновый поток активности и изменение конфигурации

1

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

В дискуссиях не указано, что можно сделать с потоком, завернутым в Object, возвращаемым из onRetainNonConfigurationInstance().

Например: 1. Есть ли способ сохранить фоновый поток, используя эту технику? 2. Нужно ли как-то приостановить поток, когда предыдущий экземпляр Activity уходит, а затем снова перезапустить его в новом экземпляре?

Может ли кто-нибудь представить короткий пример?

Любые детали будут оценены.

Теги:
multithreading
android-activity
orientation
configuration

2 ответа

2
Лучший ответ

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

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

Что вы хотите сделать в фоновом потоке?

EDIT (добавьте более подробную информацию о потоках/мероприятиях):

Темы имеют свои собственные времена жизни, которые полностью отключены от Activities. Если вы создаете Thread в Activity и запустите его, он будет запущен до завершения независимо от того, что делает ваша активность. Единственное, что явным образом остановит поток, это то, что Android решит убить ваш процесс (что может произойти, если ваш процесс не содержит активных действий).

  • 0
    Фоновый поток, запущенный действием, не имеет прямой ссылки на действие или контекст. Когда Activity создает поток, он передает две коллекции в поток, который поток будет заполнять. Таким образом, Activity и фоновый поток делятся ссылками на эти коллекции. Фоновый поток анализирует XML-файлы и загружает изображения через Интернет. Когда поток возвращается через несколько секунд, Activity может получить доступ к изображениям и другим данным из двух коллекций, которые он передал фоновому потоку.
  • 1
    Тогда у вас нет проблем. Нить просто продолжает делать свое дело. Вы просто передаете ссылку из старого действия в новое действие.
Показать ещё 2 комментария
0

Поток будет продолжать работать. В качестве примера того, что вы можете сделать с этим, вы можете проверить андроид зажигание проект и его IgnitedAsyncTask (и связанные с ним примеры).

Идея состоит в том, что вы будете поддерживать ссылку на свой поток (как правило, AsyncTask) где-то в своей Activity, а иногда ваш поток (опять же, особенно если это AsyncTask) потребует ссылки на Context, чтобы выполнить какой-то пользовательский интерфейс обновить после завершения своей фоновой задачи. Вам нужно будет убедиться, что Context (и все, что происходит от него, например TextView или т.п.), К которому ваш поток имеет ссылку, не имеет значения null, иначе он сработает.

Вы можете использовать getLastNonConfigurationInstance() чтобы установить ссылку на Activity для потока, а затем вызвать установщика в потоке, чтобы установить его ссылку на Context (чтобы избежать связанного с ним краха нулевого указателя).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню