1

我正在处理一个选项卡式布局。在第二个选项卡上,它维护着一个项目列表。如果我从第一个选项卡上的另一个列表中删除一个项目,它应该通过调用静态添加方法将其添加到第二个。如果我在应用程序第一次启动时这样做,它会给我一个空指针异常,因为数据库变量尚未在驻留在第二个选项卡上的活动中初始化(使用调试器检查)(尚未调用 onCreate 方法)。但是,如果我启动应用程序,切换到选项卡,然后切换回第一个选项卡并删除一个项目,它会正常工作,因为然后调用了 onCreate 方法。所以我的问题是,在我调用静态方法添加到它之前,我如何确保我的数据库已实例化,或者我的第二个活动/选项卡中的 onCreate?

这是调用静态方法的代码

ShoppingListActivity.addToShoppingList(name, quan);

这是静态方法

public static void addToShoppingList(String name, int quan)
{   
    shoppingDb.insertFood(name, quan);
}

这是未初始化的 shoppingDb 变量,并且由于未调用 onCreate 而返回 null。

4

1 回答 1

0

既然您使用的是静态方法,那么为什么不在第二个选项卡中使用静态布尔变量,它在应用程序启动时为 false,在调用 OnCreate 方法时为 true。然后,您将能够在 addToShoppingList 方法中测试活动的准备情况。但是要使用它,您必须存储将在 DB 初始化之前出现的数据。

像这样:

class ShopItemData{
    public String name;
    public int quan;
    public ShopItemData(String n, int q){
         name = n;
         quan = q;
    }
}

private static ArrayList<ShopItemData> shopItems = new ArrayList<ShopItemData>();
private static boolean isDBInitialized = false;


@Override
public void onCreate(Bundle savedInstanceState) {
     ...
     //initialize your database
     isDBInitialized = true;
}

...

public static void addToShoppingList(String name, int quan)
{   
    if (isDBInitialized){
        if (shopItems.size() > 0){
            for(ShopItemData item:shopItems){
                shoppingDb.insertFood(item.name,item.quan);
            }
            shopItems.clear();
        }
        shoppingDb.insertFood(name, quan);
    }else{ 
        shopItems.add(new ShopItemData(name,quan));
    }
}
于 2013-10-08T21:35:10.610 回答