У меня есть одноэлементный класс, который я впервые создаю в 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
.
Почему ваш '' restaurantMenu' не private' и 'static'? Кроме того, вы подтвердили, что экземпляр действительно создан? Общее уведомление: вы должны подтвердить, что singleton становится нулевым, поскольку Android может остановить и заново создать вашу деятельность (без повторного создания родительских действий). – dst
Добавьте еще один код из своей активности – Ahmed
Ваш singleton не должен принимать arraylist в getInstance. Или, если это так, нужно что-то делать с ним * каждый раз. Не только когда 'mInstance' равно null. Также 'restarauntMenu' должен быть закрытым и не должен быть статичным, как говорит @dst. Добавьте еще один код. –