java - 跨 Activity 的sharedPreferences上下文空指针

标签 java android in-app-purchase in-app-billing

我已经进行了应用程序内计费 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/

相关文章:

java - 在 GraphicalView 对象上调用 ZoomReset 不起作用

android - 澄清 Firebase 连接

android - ListView 的最后一项填充可用空间

ios - 如何检查用户字典中的键是否更改?

android - 如何在 iOS 和 Android 上使用硬件和服务进行应用内购买

java - Findbugs错误 "Load of known null value"SQL连接

java - Scala 中的新 Java 类 : takes type paremeters

java - Lucene 查询不工作

android - 从数据库中删除后刷新 ListView

ios - 无法完成付款队列中未完成的交易