【问题标题】:Removing observer on on destroy() android在destroy() android上删除观察者
【发布时间】:2012-09-29 14:41:11
【问题描述】:

我正在使用 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

我的问题在于 on destroy 方法。是否会出现android在停止或暂停状态没有调用onDestroy()时杀死活动的情况?如果是这种情况,我的Observerable 可能会保留对系统不再使用的活动的实时引用,这不好。还是不是这样?如果我的假设是在我的注册观察者列表中保留对我所有活动的弱引用,那么它们可以自动取消注册。这是一个好的解决方案还是不需要?

【问题讨论】:

  • 您使用 Observer 的目的是什么?
  • 我正在通过 ormlite 修改域对象。呈现这些对象的所有活动都通过观察者通知响应创建/读取/更新修改。因此,例如,我的可观察者允许我通过 OrmLite 存储库向数据库添加一个新的域对象,并且查看所有域列表的活动通过其观察者实现通知新域。

标签: android observer-pattern android-annotations


【解决方案1】:

操作系统可以在不调用 onDestroy 的情况下终止您的进程,否则您可以依赖 onDestroy 被调用。因此,只要您的 Observable 与活动处于同一进程中,就可以了。

【讨论】:

  • 所以它会在不调用onDestroy()的情况下终止整个应用程序/进程,但是在终止单个活动时它总是会调用onDestroy((?
  • 谈论一个活动被“终止”是没有意义的。当操作系统想要重用某个 Activity 持有的某些资源时,它会调用 onDestroy 让您的程序知道该 Activity 不再有效。 Activity 本身只是一个类的实例,所以它会一直保留到它被垃圾回收,但大多数方法如果被调用就会抛出异常。这与进程相反,进程确实可以由操作系统随意终止。
【解决方案2】:

根据Android documentation 上的活动生命周期,如果必须启动其他应用程序并且系统没有足够的内存,则可能会发生这种情况。

编辑:嗯,在这种情况下,系统似乎仍然会调用这个方法。我不太确定工作流程了...

【讨论】:

  • 是的,我对它是否被调用也有类似的困惑,看起来弱引用可以解决我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多