最初に 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 になる理由や方法を知っている人はいますか?getInstance
getCount
必要に応じて、アクティビティのコードを提供できます。
編集:その他のコード
シングルトンを初期化するとき: holder = RestaurantMenuHolder.getInstance(restaurantMenu);
where restaurantMenu
is 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
ます。