Java SharedReferences上下文空指针,跨活动

Java SharedReferences上下文空指针,跨活动,java,android,in-app-purchase,in-app-billing,Java,Android,In App Purchase,In App Billing,我已经做了一个应用内计费活动,成功地处理了应用内购买和查询购买,这决定了是否分配了用户,即adblock 现在,我想在我的主活动中从应用程序内活动运行我的方法,以便我可以在应用程序打开后立即查询。但是,当我运行该方法时,我得到一个nullPointerException,它来自一行,由boolean adFree=mSharedPreferences.getBoolean(getString(R.string.remove_ads_key),false)组成 我的看法是,这是由于上下文的问题,因

我已经做了一个应用内计费活动,成功地处理了应用内购买和查询购买,这决定了是否分配了用户,即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);
}
//InApp活动
私人共享参考mSharedPreferences;
私人共享参考。编辑mEditor;
私人语境;
...
公共InApp(上下文){
this.context=上下文;
}
...
onCreate(){
上下文=这个;
mSharedPreferences=PreferenceManager.getDefaultSharedReferences(上下文);
mEditor=mSharedPreferences.edit();
}
公共void setupBillingClient(上下文){
mBillingClient=BillingClient.newBuilder(上下文).setListener(this.enablePendingPurchases().build();
mBillingClient.startConnection(新的BillingClientStateListener(){
@凌驾
BillingSetupFinished(BillingResult BillingResult)上的公共无效{
if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK){
Log.i(标签“已连接账单”);
List skuList=new ArrayList();
skuList.添加(项目\u SKU\u ADREMOVAL);
SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder();
参数setskulist(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(),
新SkuDetailsResponseListener(){
@凌驾
公共无效onSkuDetailsResponse(BillingResult BillingResult,列表skuDetailsList){
if(billingResult.getResponseCode()==BillingClient.BillingResponseCode.OK&&skuDetailsList!=null){
Log.i(标记“SkuDetailsResponse OK&skuDetailsList!=null-包含:”+skuDetailsList.toString());
用于(SkuDetails SkuDetails:skuDetailsList){
Log.i(标记“skuDetails:+skuDetails.toString());
Log.i(标记“skuDetailsList:+skuDetailsList”);
字符串sku=skuDetails.getSku();
字符串price=skuDetails.getPrice();
skuDetails2=skuDetails;
Log.i(标记“SkuDetailsResponse found sku:+sku”);
如果(项目库存单位等于库存单位){
adRemovalPrice=价格;
boolean adFree=mSharedPreferences.getBoolean(getString(R.string.remove_ads_key),false);
if(adFree==false){
ad_按钮设置文本(adRemovalPrice);
}
}
}
}
}
});
}否则{
Log.i(标记“setupBillingClient()响应代码:”+billingResult.getResponseCode());
}
//queryPurchases();
}
//主要活动
静态语境;
...
mSharedPreferences=PreferenceManager.getDefaultSharedReferences(上下文);
mEditor=mSharedPreferences.edit();
...
onCreate(){
InApp InApp=新的InApp(上下文);
inApp.setupBillingClient(上下文);
}

您不能直接从其他活动调用方法,也不能创建它们或保留对它们的引用。活动是由系统创建和管理的,它在任何方面都不是POJO。它有自己的生命周期,可以随时销毁,您无法控制它-
正因为如此,应用程序逻辑必须主要与框架类解耦,并传递给其他框架类以利用实际任务。

谢谢。因此,我应该创建一个包含应用程序内计费方法的类,然后从我的InApp活动和主活动调用它们,对吗?