1 개의 액티비티에서 처음 인스턴스화 한 싱글 톤 클래스가 있습니다. 그런 다음 2 개의 다른 액티비티에 사용합니다. 두 번째 활동이로드되면 인스턴스는 null이되고 이전에는 null이 아닙니다. 여기 Android 싱글 톤이 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
에 synchronized
를 추가하는 시도,하지만, 난 여전히 때 두 번째 작업 부하는 null를 얻을. 왜 싱글 톤이 갑자기 null이 될지 누가 알 수 있습니까?
필요한 경우 활동 코드를 제공 할 수 있습니다. 나는 싱글을 초기화하면 더 많은 코드
:
편집은 restaurantMenu
가 ArrayList에 어디는 holder = RestaurantMenuHolder.getInstance(restaurantMenu);
를 실행합니다. 데이터를 저장하기 위해 이것을 초기화합니다. 이것은 작동하는 것으로 확인되며,이 시점에서 싱글 톤은 null이 아닙니다.
싱글 톤을 사용하는 첫 번째 작업에서는 을 onCreateView
에서 실행합니다. 이 인스턴스를 사용하여 이전에 저장된 데이터를 검색합니다. 싱글 톤 또한 여기에서 작동하는 것으로 확인되었습니다.
두 번째 활동이 시작되면 싱글턴은 null이되지만 즉시 그렇지는 않습니다. 두 번째 활동에서 menuHolder = RestaurantMenuHolder.getInstance();
을 다시 실행하고 더 많은 데이터를 검색합니다. 모두 유효합니다.
이 문제는 ImageAdapter에서 발생하는 것 같습니다. 두 활동 모두 ImageAdapter와 함께 slidingMenu를 사용합니다. 싱글 톤은 첫 번째 액티비티에서 작동하고 null이 아니지만 두 번째 액티비티에서 다시 사용하려고하면 null이됩니다. NullPointerException
에
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();
: 여기
는 ImageAdapter 코드에서이다. Log.d((menuHolder == null) + "", "MENUHOLDER NULL");
은 이전에 false
을 반환했을 때 true
을 반환합니다.
왜'restaurantMenu'하지'private'와'static'가 작동합니다? 또한 인스턴스가 실제로 만들어 졌는지 확인 했습니까? 일반 공지 사항 : Android가 (부모 활동을 다시 만들지 않고) 활동을 중단하고 다시 만들 수 있으므로 싱글 톤이 null이된다는 사실을 반드시 지원해야합니다. – dst
활동에서 더 많은 코드 추가 – Ahmed
당신의 싱글 톤은 getInstance에서 arraylist를 받아들이지 않아야합니다. 아니면, 그럴 때마다 * 매 시간마다 무언가를해야합니다. 'mInstance'가 null 일 때만이 아닙니다. 또한'restarauntMenu'는 private이어야하며 @dst가 말한 것처럼 정적이어서는 안됩니다. 코드를 추가하십시오. –