Java Android singleton变为空
我有一个单例类,我首先在一个活动中实例化它,然后在另外两个活动中使用它。当第二个活动加载时,实例变为null,其中以前不是null 以下是singleton类的代码:Java Android singleton变为空,java,android,singleton,Java,Android,Singleton,我有一个单例类,我首先在一个活动中实例化它,然后在另外两个活动中使用它。当第二个活动加载时,实例变为null,其中以前不是null 以下是singleton类的代码: public class RestaurantMenuHolder{ private static RestaurantMenuHolder mInstance = null; public static ArrayList<RestaurantMenuObject> restaurantMenu;
public class RestaurantMenuHolder{
private static RestaurantMenuHolder mInstance = null;
public static ArrayList<RestaurantMenuObject> restaurantMenu;
public static RestaurantMenuHolder getInstance(ArrayList<RestaurantMenuObject> restaurantMenu){
if(mInstance == null){
mInstance = new RestaurantMenuHolder(restaurantMenu);
}
return mInstance;
}
public static RestaurantMenuHolder getInstance(){
return mInstance;
}
private RestaurantMenuHolder(ArrayList<RestaurantMenuObject> restaurantMenu){
this.restaurantMenu = restaurantMenu;
}
public static int getCount(){
return restaurantMenu.size();
}
}
当第二个活动启动时,
返回menuHolder.getCount()代码>导致出现NullPointerException
<代码>Log.d((menuHolder==null)+“”,“menuHolder null”)
此时返回true
,之前返回false
只需进行一次更改即可
public class RestaurantMenuHolder{
private static RestaurantMenuHolder mInstance = null;
public static ArrayList<RestaurantMenuObject> restaurantMenu;
public static RestaurantMenuHolder getInstance(ArrayList<RestaurantMenuObject> restaurantMenu){
if(mInstance == null){
mInstance = new RestaurantMenuHolder(restaurantMenu);
}
return mInstance;
}
public static RestaurantMenuHolder getInstance(){
if(mInstance == null){
mInstance = new RestaurantMenuHolder(restaurantMenu);
}
return mInstance;
}
private RestaurantMenuHolder(ArrayList<RestaurantMenuObject> restaurantMenu){
this.restaurantMenu = restaurantMenu;
}
public static int getCount(){
return restaurantMenu.size();
}
}
public class RestaurantMenuHolder{
私有静态RestaurantMenuHolder minInstance=null;
公共静态ArrayList restaurantMenu;
公共静态RestaurantMenuHolder getInstance(ArrayList restaurantMenu){
if(minInstance==null){
MinInstance=新餐厅菜单持有人(餐厅菜单);
}
回报率;
}
公共静态RestaurantMenuHolder getInstance(){
if(minInstance==null){
MinInstance=新餐厅菜单持有人(餐厅菜单);
}
回报率;
}
私人餐厅菜单持有人(ArrayList restaurantMenu){
this.restaurantmens=restaurantmens;
}
公共静态int getCount(){
return restaurantMenu.size();
}
}
为什么您的餐厅菜单
不是私有的
和静态的
?另外,您是否验证了实例是否已实际创建?一般注意:您必须支持singleton变为null,因为Android可能会停止并重新创建您的活动(而不重新创建父活动)。从您的活动中添加更多代码您的singleton不应接受getInstance中的arraylist。或者,如果是的话,它每次都需要用它做点什么。不仅仅是当minInstance
为空时。另外,restaruntmenu
应该是私有的,而不应该像@dst所说的那样是静态的。请添加更多代码。感谢您的输入restaurantMenu
处于static
状态是一个错误,我忘了恢复;我在测试使它静态是否能解决问题。我将restaurantMenu
更改为private并添加了一个getter方法,但错误仍然发生。我已经验证了单例在第一个活动中使用时不为null,在第二个活动中尝试使用时变为null。在我的单例中,我在初始化它时传入arrayList来存储它。我每次都要用它做点什么,有什么理由吗?我调用了getInstance()
,但没有arrayList来检索它。谢谢,这解决了这个问题,尽管我现在遇到了另一个问题。您也应该对您的建议进行一些解释,这可能会帮助其他人。
public class RestaurantMenuHolder{
private static RestaurantMenuHolder mInstance = null;
public static ArrayList<RestaurantMenuObject> restaurantMenu;
public static RestaurantMenuHolder getInstance(ArrayList<RestaurantMenuObject> restaurantMenu){
if(mInstance == null){
mInstance = new RestaurantMenuHolder(restaurantMenu);
}
return mInstance;
}
public static RestaurantMenuHolder getInstance(){
if(mInstance == null){
mInstance = new RestaurantMenuHolder(restaurantMenu);
}
return mInstance;
}
private RestaurantMenuHolder(ArrayList<RestaurantMenuObject> restaurantMenu){
this.restaurantMenu = restaurantMenu;
}
public static int getCount(){
return restaurantMenu.size();
}
}