我已经进行了应用程序内计费 Activity ,成功处理了应用程序内购买和查询购买,这确定了用户是否被分配,即。广告拦截。
现在我想从应用程序内 Activity 中的主要 Activity 中运行我的方法,以便我可以在应用程序打开后立即进行查询。但是,当我运行该方法时,我收到 nullPointerException,该异常源自由 boolean adFree = mSharedPreferences.getBoolean(getString(R.string.remove_ads_key), false);
我对此的看法是,这是由于上下文问题造成的,因为我在 MainActivity 中调用 InApp Activity 中的方法。虽然我不知道如何解决这个问题,但希望您能提供任何帮助。
//InApp Activity
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
private Context context;
...
public InApp(Context context){
this.context = context;
}
...
onCreate() {
context = this;
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
mEditor = mSharedPreferences.edit();
}
public void setupBillingClient(Context context){
mBillingClient = BillingClient.newBuilder(context).setListener(this).enablePendingPurchases().build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
Log.i(TAG, "Billing Connected");
List<String> skuList = new ArrayList<>();
skuList.add(ITEM_SKU_ADREMOVAL);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener(){
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null){
Log.i(TAG, "SkuDetailsResponse OK & skuDetailsList !=null - Contains: " + skuDetailsList.toString());
for (SkuDetails skuDetails : skuDetailsList) {
Log.i(TAG, "skuDetails: " + skuDetails.toString());
Log.i(TAG, "skuDetailsList: " + skuDetailsList);
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
skuDetails2 = skuDetails;
Log.i(TAG, "SkuDetailsResponse found sku: " + sku);
if (ITEM_SKU_ADREMOVAL.equals(sku)){
adRemovalPrice = price;
boolean adFree = mSharedPreferences.getBoolean(getString(R.string.remove_ads_key), false);
if (adFree == false){
ad_button.setText(adRemovalPrice);
}
}
}
}
}
});
}else{
Log.i(TAG, "setupBillingClient() ResponseCode: " + billingResult.getResponseCode());
}
//queryPurchases();
}
//MainActivity
static Context context;
...
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
mEditor = mSharedPreferences.edit();
...
onCreate(){
InApp inApp = new InApp(context);
inApp.setupBillingClient(context);
}
最佳答案
您不得直接从其他 Activity 调用方法,也不得创建它们或保留对它们的引用。 Activity是由系统创建和管理的,它无论如何都不是POJO。它有自己的生命周期,可以随时被销毁,而你无法控制它 - https://developer.android.com/reference/android/app/Activity#ActivityLifecycle 因此,应用程序逻辑必须主要与框架类解耦并传递以利用实际任务。
关于java - 跨 Activity 的sharedPreferences上下文空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60347027/