2013-08-23 8 views
1

У меня есть одноэлементный класс, который я впервые создаю в 1 действии, а затем использую его в 2 других действиях. Когда загружается 2-й актив, экземпляр становится null, где раньше не было null.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(); 
    } 

} 

Я попытался добавить synchronized к getInstance методов, конструктор и getCount, но я все еще получаю нуль, когда второй груз активности. Кто-нибудь знает, почему или как синглтон внезапно станет нулевым?

Я могу предоставить код для действий, если это необходимо.

EDIT: Подробнее Код

Когда я инициализировать синглтон: Я бегу holder = RestaurantMenuHolder.getInstance(restaurantMenu); где restaurantMenu является ArrayList. Я инициализирую это для хранения данных. Это проверено на работу, на данный момент singleton не равен null.

В первом действии, которое я использую singleton, я запускаю RestaurantMenuHolder menuHolder = RestaurantMenuHolder.getInstance(); в onCreateView для фрагмента. Я использую этот экземпляр для извлечения ранее сохраненных данных. Синглтон также проверен для работы здесь.

При запуске второго действия синглтон становится нулевым, но не сразу. Я снова запускаю menuHolder = RestaurantMenuHolder.getInstance(); во втором действии и извлекаю еще несколько данных, все из которых действительны.

Проблема возникает в ImageAdapter. Я использую slideMenu с ImageAdapter для обоих действий. Singleton работает для первого действия и не является нулевым, но становится нулевым, когда я пытаюсь использовать его снова во втором действии.

Вот код из 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.

+2

Почему ваш '' restaurantMenu' не private' и 'static'? Кроме того, вы подтвердили, что экземпляр действительно создан? Общее уведомление: вы должны подтвердить, что singleton становится нулевым, поскольку Android может остановить и заново создать вашу деятельность (без повторного создания родительских действий). – dst

+0

Добавьте еще один код из своей активности – Ahmed

+2

Ваш singleton не должен принимать arraylist в getInstance. Или, если это так, нужно что-то делать с ним * каждый раз. Не только когда 'mInstance' равно null. Также 'restarauntMenu' должен быть закрытым и не должен быть статичным, как говорит @dst. Добавьте еще один код. –

ответ

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

Смежные вопросы