Java SharedReferences上下文空指针,跨活动
我已经做了一个应用内计费活动,成功地处理了应用内购买和查询购买,这决定了是否分配了用户,即adblock 现在,我想在我的主活动中从应用程序内活动运行我的方法,以便我可以在应用程序打开后立即查询。但是,当我运行该方法时,我得到一个nullPointerException,它来自一行,由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)组成 我的看法是,这是由于上下文的问题,因
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活动和主活动调用它们,对吗?