android中的单例破坏、类加载等
我想弄清楚android中类的加载、对象的销毁等,因为我注意到在我的活动中使用Singleton时发生了一些奇怪的事情。我将用以下代码描述它: 我的单身班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();
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");
}