Android强大的参考

时间:2010-01-15 11:13:14

标签: android object

我正在使用SearchCritiera对象并将其设为singleton并将此变量声明为static, 现在的问题是,如果我让我的应用程序保持打开状态几个小时,Android操作系统会删除静态对象,我怎样才能确保操作系统不会删除静态对象。

就像我知道像

这样的关键字很少

周参考和软参考是否有任何strongreference关键字,可以告诉Android操作系统不删除引用?

3 个答案:

答案 0 :(得分:3)

不要使用静态引用,即使你的应用程序仍在前台,垃圾收集器也可能会破坏这些对象(我现在已经看过几次)。

您可以通过将它们存储在唯一的Application实例中来避免这种情况。只要您的应用程序保证该对象能够存活。

答案 1 :(得分:1)

可悲的是,您无法强制Android将您的应用程序保留在内存中。如果操作系统认为它需要更多的内存用于前台应用程序或服务,它保留终止您的一个或所有活动的权利。

我假设正在发生的事情是你的静态对象在你调用时丢失并重新创建,这意味着它已经失去了它的状态。也就是说,如果你在前台Activity中引用了这个对象,我会有点惊讶它会迷失。

你可以解决这个问题的最好方法是挂钩the lifecycle events并保存你的单例对象的状态,然后在适当的时候恢复它。

不幸的是,Androd没有应用程序范围的生命周期事件。有关如何保存瞬态应用程序状态,请查看this question

答案 2 :(得分:1)

如果我没有错,应用程序长时间保持打开数据由android OS发布,而stopiong活动它会调用“onSaveInstanceState”,什么时候可以将searchritiera存储到此方法中,并在“onRestoreInstanceState”时返回“被叫了?

private static SearchCriteria searchCriteria;


@Override 
    public void onSaveInstanceState(Bundle outState) 
    {
        outState.putSerializable(WLConstants.SEARCH_CRITERIA, searchCriteria);
        super.onSaveInstanceState(outState); 
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if(savedInstanceState != null){
            searchCriteria = (SearchCriteria)
            savedInstanceState.getSerializable(WLConstants.SEARCH_CRITERIA);
        }
        super.onRestoreInstanceState(savedInstanceState);
    }