Фрагменты, setRetainInstance (true) и потоковые библиотеки

#android #android-fragments

#Android #android-фрагменты

Вопрос:

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

И здесь, в демонстрационных версиях API для фрагментов, показано, как использовать этот метод для поддержки потоков после изменения конфигурации.

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

Однако, если вы используете потоковую библиотеку (например, библиотеку API, использующую thread executor), к которой у вас нет доступа wait() в указанных потоках, как мы могли бы использовать эту новую функцию в наших интересах?

Как мы можем гарантировать, что сообщения не будут доставлены, пока действие не прикреплено?

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

Также, обратите внимание, я изучил API LoaderManager, и кажется, что это было бы полезно для данных, которые необходимо загружать при отображении действия, но не для чего-то, основанного на событиях, например, для входа в систему с помощью кнопки и т.д.

Комментарии:

1. Почему загрузчик не подходит для процесса входа в систему? В принципе, что угодно может быть выполнено в AsyncTask и быть упаковано в загрузчик. Интерфейс LoaderCallbacks может использоваться для получения уведомлений о завершении задачи. Предполагая, что вы хотите запустить другое действие после завершения входа в систему, запуск действия в onLoadFinished() должен работать просто отлично, не так ли? Пожалуйста, уточните подробнее об этом, если нет.

Ответ №1:

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

Как только действие подключено, вы можете снять блокировку, позволяя всем потокам предоставлять свои результаты.