пустой указатель контекста sharedPrefferences - PullRequest
0 голосов
/ 22 февраля 2020

Я выполнил платежную операцию в приложении, успешно обработав покупки в приложении, среди запросов на покупку, которая определяет, назначен ли пользователь ie. 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);
}

1 Ответ

0 голосов
/ 22 февраля 2020

Вы не должны напрямую вызывать методы из других действий, ни создавать их, ни сохранять ссылки на них. Деятельность создается и управляется системой, это никак не POJO. Он имеет собственный жизненный цикл и может быть уничтожен в любой момент, и вы не можете его контролировать - https://developer.android.com/reference/android/app/Activity#ActivityLifecycle Из-за этого логики приложения c должны быть в основном отделены от классов инфраструктуры и переданы в использовать актуальные задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...