1

最初に 1 つのアクティビティでインスタンス化してから、他の 2 つのアクティビティで使用するシングルトン クラスがあります。2 番目のアクティビティが読み込まれると、以前は null ではなかったインスタンスが 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ましたが、2 番目のアクティビティが読み込まれると、まだ null になります。シングルトンが突然 null になる理由や方法を知っている人はいますか?getInstancegetCount

必要に応じて、アクティビティのコードを提供できます。

編集:その他のコード

シングルトンを初期化するとき: holder = RestaurantMenuHolder.getInstance(restaurantMenu);where restaurantMenuis an arrayList を実行します。これを初期化してデータを保存します。これは機能することが確認されており、この時点でシングルトンは null ではありません。

シングルトンを使用する最初のアクティビティでRestaurantMenuHolder menuHolder = RestaurantMenuHolder.getInstance();onCreateView、フラグメントに遭遇します。このインスタンスを使用して、以前に保存したデータを取得します。シングルトンもここで動作することが確認されています。

2 番目のアクティビティが開始されると、シングルトンは null になりますが、すぐにはなりません。2 番目のアクティビティで再度実行menuHolder = RestaurantMenuHolder.getInstance();し、さらにデータを取得します。これらはすべて有効です。

問題は ImageAdapter で発生するようです。私は、両方のアクティビティに ImageAdapter を備えた slideMenu を使用しています。シングルトンは最初のアクティビティで機能し、null ではありませんが、2 番目のアクティビティで再度使用しようとすると 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

2 番目のアクティビティが開始されると、return menuHolder.getCount();結果はNullPointerException. Log.d((menuHolder == null) + "", "MENUHOLDER NULL");は、以前に を返しtrueたときに、この時点で戻りfalseます。

4

1 に答える 1

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

}
于 2013-08-23T04:55:54.027 に答える