我有一個單例類,我首先在1個活動中實例化,然後在2個其他活動中使用它。當第二個活動加載時,實例變爲空,其中之前不爲空。Android singleton變爲null
下面是單例類代碼:
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();
}
}
我曾嘗試加入到getInstance
方法,構造函數和getCount
,但是我還是空的第二個活動負載時。有人知道單身人士突然變爲零的原因或方式嗎?
我可以根據需要爲活動提供代碼。
編輯:更多的代碼
當我初始化單身:我跑holder = RestaurantMenuHolder.getInstance(restaurantMenu);
其中restaurantMenu
是的ArrayList。我初始化這個來存儲數據。這被證實是可行的,在這一點上單身人士不是空的。
在我使用單例的第一個活動中,我在onCreateView
中爲片段運行RestaurantMenuHolder menuHolder = RestaurantMenuHolder.getInstance();
。我使用這個實例來檢索先前存儲的數據。單身人士也被證實在這裏工作。
當第二個活動開始時,單例變爲null,但不是立即。我在第二個活動中再次運行menuHolder = RestaurantMenuHolder.getInstance();
並檢索更多數據,所有這些數據都是有效的。
該問題似乎發生在ImageAdapter中。我爲這兩項活動都使用了帶有ImageAdapter的slidingMenu。單身人士適用於第一次活動,並且不爲null,但在第二次活動中嘗試再次使用它時變爲null。
下面是從ImageAdapter代碼:
public class ImageAdapter extends BaseAdapter{
private static LayoutInflater inflater = null;
private ViewHolder holder;
private String id;
private RestaurantMenuHolder menuHolder;
private RestaurantLocationHolder locationHolder;
private Context context;
private String[] sliding_list = {"Home", "Skip to Menu", "Location & Hours", "About Us"};
Typeface tf;
public ImageAdapter(Context context, String id){
this.context = context;
inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.id = id;
tf = Typeface.createFromAsset(context.getAssets(),
"Roboto-Light.ttf");
menuHolder = RestaurantMenuHolder.getInstance();
locationHolder = RestaurantLocationHolder.getInstance(context);
MenuUtilities.setImageHash();
}
@Override
public int getCount() {
if(id == "menu"){
Log.d((menuHolder == null) + "", "MENUHOLDER NULL");
return menuHolder.getCount();
} else if (id == "location") {
return locationHolder.getCount();
} else {
return sliding_list.length;
}
}
... more code
當第二活動開始時,return menuHolder.getCount();
導致NullPointerException
。 Log.d((menuHolder == null) + "", "MENUHOLDER NULL");
此時返回true
,此前它已返回false
。
爲什麼你'restaurantMenu'不'private'和'static'?另外,您是否確認實例是否實際創建?一般通知:您必須支持單例變爲null,因爲Android可能停止並重新創建您的活動(無需重新創建父活動)。 – dst
在您的活動中添加更多代碼 – Ahmed
您的單身人士不應該在getInstance中接受arraylist。或者,如果是這樣,它需要每做一次*。不只是當'mInstance'爲空時。 @ rest表示,restarauntMenu應該是私人的,不應該是靜態的。請添加更多代碼。 –