代码之家  ›  专栏  ›  技术社区  ›  d-man

Android强引用

  •  5
  • d-man  · 技术社区  · 15 年前

    我有searchCritiera对象,我将其设置为singleton并将此变量声明为static, 现在的问题是,如果我让我的应用程序保持几个小时的开放状态,静态对象被Android操作系统删除,我如何确保静态对象不被操作系统删除。

    就像我知道有几个关键词像

    weekreference和softreference有没有strongreference关键字可以告诉android操作系统不要删除引用??

    3 回复  |  直到 15 年前
        1
  •  3
  •   mxk    15 年前

    不要使用静态引用,即使您的应用程序保持在前台,这些对象也可能被垃圾收集器破坏(我已经看到这种情况发生了几次)。

    通过将它们存储在您的 Application 实例。该对象的寿命保证与您的应用程序相同。

        2
  •  1
  •   Community paulsm4    7 年前

    遗憾的是,你不能强迫Android将你的应用程序保存在内存中。如果操作系统认为前台应用程序或服务需要更多内存,它保留终止一项或全部活动的权利。

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

    你能做的最好的工作就是 the lifecycle events 并保存singleton对象的状态,然后在适当的时候还原它。

    不幸的是,Androd中没有应用程序范围的生命周期事件。看一看 this question 如何保存临时应用程序状态。

        3
  •  1
  •   d-man    15 年前

    如果我没有错,当应用程序长时间处于打开状态时,android操作系统会释放数据,当停止活动时,它会调用“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);
        }