Удаление наблюдателя при уничтожении() андроида

Я разрабатываю для Android, используя аннотации Android. У меня есть одноэлементный наблюдаемый объект, для которого я хочу добавить активность в качестве наблюдателя. Что-то вроде следующего:

@EActivity(R.layout.myActivity)
public class MyActivity extends SherlockActivity implements Observer { 

    @Bean //has singleton scope
    protected Observerable o;

    @Override
    public void onCreate() {
        o.registerObserver(this);
    }

    @Override
    public void onDestroy() {
        o.unregisterObserver(this);
    }

    //more code

Мой вопрос связан с методом уничтожения. Будет ли ситуация, когда Android убивает активность во время остановки или паузы без вызова onDestroy()? Если это так, мой Observerable может содержать ссылку на активность, которая больше не используется системой, что нехорошо. Или это не так? Если это моя презумпция, то я буду хранить слабые ссылки на все мои действия в моем списке зарегистрированных наблюдателей, чтобы их можно было автоматически отменить. Это хорошее решение или оно не нужно?


person mogronalol    schedule 29.09.2012    source источник
comment
Для каких целей вы используете Observer?   -  person Dharmendra    schedule 29.09.2012
comment
Я изменяю объекты домена через ormlite. Все действия, которые отображают эти объекты, реагируют на изменения Create / Read / Update через уведомление наблюдателя. Так, например, мой наблюдатель позволяет мне добавить новый объект домена в базу данных через репозиторий OrmLite, а активность, просматривающая список всех доменов, уведомляется о новом домене через его реализацию наблюдателя.   -  person mogronalol    schedule 29.09.2012


Ответы (2)


ОС может завершить ваш процесс, не вызывая onDestroy, но в остальном вы можете полагаться на вызов onDestroy. Итак, если ваш Observable находится в том же процессе, что и активность, все в порядке.

person Tom Mulcahy    schedule 29.09.2012
comment
Таким образом, он завершит все приложение/процесс без вызова onDestroy(), но при завершении отдельных действий он всегда будет вызывать onDestroy((? - person mogronalol; 30.09.2012
comment
Говорить о прекращении действия не имеет смысла. Когда ОС хочет повторно использовать некоторые ресурсы, удерживаемые действием, она вызывает onDestroy, чтобы сообщить вашей программе, что это действие больше недействительно. Сама активность является просто экземпляром класса, поэтому она остается до тех пор, пока не будет удалена сборщиком мусора, но большинство методов при вызове будут генерировать исключения. Это в отличие от процесса, который действительно может быть прекращен ОС по желанию. - person Tom Mulcahy; 03.10.2012

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

Изменить: похоже, в этом случае система все равно будет вызывать этот метод. Я уже не совсем уверен в рабочем процессе...

person DayS    schedule 29.09.2012
comment
да, я в таком же замешательстве относительно того, называется ли это, похоже, слабые ссылки могут решить мою проблему тогда - person mogronalol; 29.09.2012