Эмпирическое правило: места должны быть неизменными. Имея это в виду, использовать одноэлементное место можно только в том случае, если к месту не привязаны данные (как в вашем примере HomePlace
). Поскольку места настолько легковесны, последствия использования синглтона по сравнению с созданием нового экземпляра незначительны.
Совсем другая история с действиями, потому что они не являются объектами-ценностями.
Что означает использование одноэлементной активности?
- вы должны очистить состояние в
onStop
и onCancel
, иначе состояние от предыдущего использования действия может просочиться в более позднее его использование. Хотя в некоторых случаях это полезно, я думаю, что лучше оставить поведение кеширования отдельным (разделение задач).
- синглтоны по определению хранятся в памяти на протяжении всего жизненного цикла приложения, даже те, которые пользователь увидит/использует только один раз. Например, экран приветствия в Google Groups, скорее всего, будет показан только один раз за запуск приложения, так зачем хранить его в памяти?
- если вы перемещаетесь между двумя местами, которые оба сопоставляются с одной и той же активностью, активность не будет перезапущена (это особенность
ActivityMapper
), поэтому вам нужно как-то сигнализировать активности, что место изменилось (при необходимости, конечно ). Это можно сделать в ActivityMapper
или заставить активность прослушивать PlaceChangeEvent
s.
Если вы используете MVP (отделение представления от действия), действия, как правило, невелики, поэтому использование краткосрочных освобождает вас от вышеперечисленного убедитесь, что вы очистили все в onStop
и onCancel
и сообщить активности, что место изменилось, и в целом все упрощается: активность создается, затем запускается, затем отменяется или останавливается, и она исчезает, готовая к сборке мусора. Если вам нужно хранить в кеше некоторые данные или результаты вычислений, используйте явный объект кеша, который будет совместно использоваться всеми экземплярами вашей активности; это проясняет ситуацию.
Небольшое примечание о MVP и жизненном цикле представлений: представления (виджеты), как правило, тяжеловесны, поэтому для часто используемых можно сделать их синглтонами. В этом случае ваша активность должна будет очищать состояние представления (значения полей и т. д.) в своем методе start
(или, возможно, onStop
и onCancel
), каким-то образом побеждая использование краткосрочных действий. кэширование представления (вы можете не использовать один элемент, а хранить экземпляр в памяти в течение некоторого времени и удалять его после некоторой задержки) следует рассматривать как оптимизацию здесь, где создание нового представления стоит намного больше, чем его очистка при запуске активности. Это компромисс.
Мой подход к MVP заключается в том, что представление не имеет состояния само по себе, то есть докладчик действительно контролирует то, что представление должно отображать/знать/и т. д. поэтому очистка представления start
является частью потока: ведущий (во многих случаях действие) знает, в каком состоянии оно находится, и отражает это состояние в представлении; а start
— это время, когда ему передается управление представлением. Этот подход был описан Google при создании Wave во время Google I/O 2010 в Рекомендации по тестированию GWT.
person
Thomas Broyer
schedule
23.11.2012
Place
и возвращаете этот объект в getPlace, этот объект будет удален из памяти после остановкиActivity
. По деятельности такая же ситуация. Но если вы будете хранить все эти объекты в мапперах, вы будете использовать больше клиентской памяти. В то время как места — это маленькие объекты, действия могут быть огромными. Надеюсь, мое объяснение понятно :) - person Sergey Vedernikov   schedule 23.11.2012