Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android singleton变为空_Java_Android_Singleton - Fatal编程技术网

Java Android 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;

我有一个单例类,我首先在一个活动中实例化它,然后在另外两个活动中使用它。当第二个活动加载时,实例变为null,其中以前不是null

以下是singleton类的代码:

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();
    }

}