sharedPrefrences上下文空指针,跨活动

问题描述 投票:0回答:1

我进行了应用内结算活动,在查询购买中成功处理了应用内购买,这确定了是否分配了用户。 adblock。

现在,我想在应用程序活动中的主要活动中运行我的方法,以便我可以在应用程序打开后立即进行查询。但是,当我运行该方法时,我会得到一个nullPointerException,该异常源自boolean adFree = mSharedPreferences.getBoolean(getString(R.string.remove_ads_key), false);

的行

我的看法是,这是由于上下文问题所致,正如我在MainActivity中那样,是从InApp活动中调用方法。尽管我不知道该如何解决此问题,并且希望您能提供任何帮助。

//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);
}
java android in-app-purchase in-app-billing
1个回答
0
投票

您不得直接从其他活动中调用方法,也不能创建它们或对其进行引用。活动是由系统创建和管理的,无论如何都不是POJO。它具有自己的生命周期,可以随时销毁,您无法控制-https://developer.android.com/reference/android/app/Activity#ActivityLifecycle因此,必须主要将应用程序逻辑与框架类分离,并传递它们以利用实际任务。

© www.soinside.com 2019 - 2024. All rights reserved.