2013-08-23 6 views
1

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 방법, 생성자 및 getCountsynchronized를 추가하는 시도,하지만, 난 여전히 때 두 번째 작업 부하는 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을 반환합니다.

+2

왜'restaurantMenu'하지'private'와'static'가 작동합니다? 또한 인스턴스가 실제로 만들어 졌는지 확인 했습니까? 일반 공지 사항 : Android가 (부모 활동을 다시 만들지 않고) 활동을 중단하고 다시 만들 수 있으므로 싱글 톤이 null이된다는 사실을 반드시 지원해야합니다. – dst

+0

활동에서 더 많은 코드 추가 – Ahmed

+2

당신의 싱글 톤은 getInstance에서 arraylist를 받아들이지 않아야합니다. 아니면, 그럴 때마다 * 매 시간마다 무언가를해야합니다. 'mInstance'가 null 일 때만이 아닙니다. 또한'restarauntMenu'는 private이어야하며 @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

관련 문제