我希望在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
的其他成员仍然存在。为什么只有这个?
发生了什么!???
答案 0 :(得分:0)
当您调用方法attachListener()
时,您正在创建对链接对象的引用(即使它是静态的):此引用将绑定到活动生命周期。
另一方面, filterCriteria 将遵循静态字段类似Java的生命周期(但您仍然可以手动删除此引用)。