我正在應用程序中實施應用內結算服務。我在onCreate()
中設置了撥打IabHelper.queryInventoryAsync()
來檢索以前的購買。如果該項目是購買的,我將全局布爾變量設置爲true。同時,在onCreateOptionsMenu()
中,我檢查該變量是否刪除MenuItem或不。我的問題是onCreateOptionsMenu()
,正如所料,有時會在異步任務完成之前調用設置我的布爾變量。我需要一個解決方案來告訴onCreateOptionsMenu()
等待該任務設置布爾值,以便它可以相應地創建菜單。這裏的代碼詳細:從異步任務接收數據後編輯選項菜單
@Override
protected void onCreate(Bundle savedInstanceState) {
//other stuff...
helper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result,
Inventory inventory) {
if (result.isFailure()) {
// handle error here
return;
}
if (inventory.hasPurchase(REMOVE_ADS_SKU)) {
//item purchased. set control variable
isNoAds = true;
}
}
});
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//if the control variable is true, remove the option to buy ad-free version
if (isNoAds) menu.removeItem(R.id.action_remove_ads);
return super.onCreateOptionsMenu(menu);
}
這似乎乾淨地解決了這個問題,因爲看起來invalidateOptionsMenu()不需要任何對菜單本身的引用,並且在菜單沒有調用時沒有明顯的異常風險由於該方法放置在onCreate()中,所以這是我的擔心。我確實想到了這個解決方案,但是我使用的是api 10,但我錯過了這個方法的兼容版本:)非常感謝! – devrocca