android中的单例破坏、类加载等

android中的单例破坏、类加载等,android,singleton,classloader,Android,Singleton,Classloader,我想弄清楚android中类的加载、对象的销毁等,因为我注意到在我的活动中使用Singleton时发生了一些奇怪的事情。我将用以下代码描述它: 我的单身班 public class FilterCriteria { private final String TAG=FilterCriteria.class.getSimpleName(); private static FilterCriteria filterCriteria=new FilterCriteria();

我想弄清楚android中类的加载、对象的销毁等,因为我注意到在我的活动中使用Singleton时发生了一些奇怪的事情。我将用以下代码描述它: 我的单身班

public class FilterCriteria  {

    private final String TAG=FilterCriteria.class.getSimpleName();
    private static FilterCriteria filterCriteria=new FilterCriteria();

    private FilterCriteria()
    {

    }

    public static FilterCriteria getInstance()
    {
        return filterCriteria;
    }

    private int rentUpperBound,rentLowerBound;
    private int bedrooms,baths;
    private float distance;
    private ObjectStateListener listener;

    public void setFilters(float distance,int baths,int bedrooms,int rentLowerBound,int rentUpperBound) {

        this.distance = distance;
        this.baths=baths;
        this.bedrooms=bedrooms;
        this.rentLowerBound=rentLowerBound;
        this.rentUpperBound=rentUpperBound;
        if(listener!=null)
            listener.onObjectStateChanged();
    }

    public void attachListener(ObjectStateListener listener) {
        if (this.listener == null) {
            this.listener = listener;
            Log.v(TAG, "NO LISTENER PRESENT AS EXPECTED");
        } else {
            Log.v(TAG, "LISTENER PRESENT!!! BUT THE ACTIVITY WAS STARTED JUST NOW.");
        }
    }

     public void destroy()
    {
        filterCriteria=null;
    }

}
attachListenerObjectStateListener函数在活动中仅调用一次。因此,当我第一次打开我的活动时,我从attachListener函数中得到这个日志

现在,我关闭活动,然后重新打开它。但是现在我得到了这个日志

因此,这意味着即使在活动和应用程序关闭之后,对象仍然存在。这正常吗??? 因此,我尝试使用Activity的onDestroy函数中的destroy函数来销毁singleton实例

但我在这行filterCriteria.destroy上发现了NullPointerException。所以,这意味着android已经将对象设为null,而当我在调试模式下看到时,活动的其他成员仍然活着。为什么只有这个是空的?
发生了什么事

调用方法attachListener时,您正在创建对链接对象的引用,即使它是静态的:此引用将绑定到活动生命周期


另一方面,filterCriteria将遵循类似Java的静态字段生命周期,但您仍然可以手动删除此引用。

好吧。。。我想你知道静态实例在哪里。。。直接位于应用范围之下,不在活动范围之内。最好在本问题中讨论@SarveshKumarSingh那么为什么只有filterActivity为空,而活动的其他成员静态和非静态都存在。FilterCriteria.getInstance.destroy是否等于FilterCriteria.destroy?对于“NullPointerException”,最好附加exceptionFilter条件的logcat不是静态私有静态FilterCriteria FilterCriteria是静态的field@bonnz:好的。我说的是活动中使用的filterCriteria对象。FilterCriteria FilterCriteria=FilterCriteria.getInstancefilterCriteria对象在FilterCriteria类中处于活动状态,直到垃圾收集器运行
NO LISTENER PRESENT AS EXPECTED
"LISTENER PRESENT!!! BUT THE ACTIVITY WAS STARTED JUST NOW."
@Override
      protected void onDestroy(){
            filterCriteria.destroy();//Trying to destroy the singleton
            super.onDestroy();
            Log.v(TAG,"Destroying activity");
           }