2013-08-23 28 views
1

我有一個單例類,我首先在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();導致NullPointerExceptionLog.d((menuHolder == null) + "", "MENUHOLDER NULL");此時返回true,此前它已返回false

+2

爲什麼你'restaurantMenu'不'private'和'static'?另外,您是否確認實例是否實際創建?一般通知:您必須支持單例變爲null,因爲Android可能停止並重新創建您的活動(無需重新創建父活動)。 – dst

+0

在您的活動中添加更多代碼 – Ahmed

+2

您的單身人士不應該在getInstance中接受arraylist。或者,如果是這樣,它需要每做一次*。不只是當'mInstance'爲空時。 @ rest表示,restarauntMenu應該是私人的,不應該是靜態的。請添加更多代碼。 –

回答

0

只是做單一的變化,將工作

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

} 
+0

謝謝,這解決了這個問題,雖然我現在正在經歷另一個問題。 –

+0

你也應該對你的建議給予一些解釋,這可能會幫助其他人。 – RishiPandey