Android中的Singleton Destruction,Class Loading等

时间:2015-01-30 08:59:10

标签: android singleton classloader

我希望在android中加载类,破坏对象等,因为我注意到在My Activity中使用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;
    }

}

attachListener(ObjectStateListener listener)函数仅在活动中调用一次。因此,当我第一次打开我的活动时,我会从attachListener功能

获取此日志
NO LISTENER PRESENT AS EXPECTED

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

"LISTENER PRESENT!!! BUT THE ACTIVITY WAS STARTED JUST NOW."

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

@Override
      protected void onDestroy(){
            filterCriteria.destroy();//Trying to destroy the singleton
            super.onDestroy();
            Log.v(TAG,"Destroying activity");
           }


但我在NullPointerException这一行得到了filterCriteria.destroy()。所以,这意味着android已经使对象为null,而当我在调试模式下看到时,Activity的其他成员仍然存在。为什么只有这个?

发生了什么!???

1 个答案:

答案 0 :(得分:0)

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

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