Admob Interstitial Singleton Pattern java.lang.NullPointerException: - PullRequest
0 голосов
/ 05 октября 2019

Я использую шаблон Singleton , чтобы показать Admob Interstitial. На самом деле нет проблем в эмуляторе. Я пробовал в разных смартфонах без проблем. Все работает хорошоНо когда дело доходит до консоли разработчика Google Play, я получаю эти ошибки.

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2200)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2250)
  at android.app.ActivityThread.access$800 (ActivityThread.java:139)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1200)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:136)
  at android.app.ActivityThread.main (ActivityThread.java:5105)
  at java.lang.reflect.Method.invokeNative (Native Method)
  at java.lang.reflect.Method.invoke (Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:792)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:608)
  at dalvik.system.NativeStart.main (Native Method)
Caused by: java.lang.NullPointerException: 
  at x.y.z.ViewItemActivity.onCreate (ViewItemActivity.java:48)
  at android.app.Activity.performCreate (Activity.java:5275)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1087)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2164)

Причина: java.lang.NullPointerException: at xyzViewItemActivity.onCreate (ViewItemActivity.java:48)

Строка 48 в ViewItemActivity:

if (ad.isLoaded()) {//Line 48
            ad.show();
        }

Позвольте мне показать, класс AdManager и использование

Класс AdManager:

package x;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.util.Log;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;

import x.y.z.R;
import x.y.z.app.App;

public class AdManager {


    static InterstitialAd ad;
    private Context ctx;

    public AdManager(Context ctx) {
        this.ctx = ctx;
    }

    public void createAd() {
        // Create an ad.
        ad = new InterstitialAd(ctx);
        ad.setAdUnitId(App.getResourses().getString(R.string.interstitial_ad_unit));

        final AdRequest adRequest = new AdRequest.Builder().build();

        // Load the interstitial ad.
        ad.loadAd(adRequest);

       // Log.d("admobshowing","asdf");
    }

    public InterstitialAd getAd() {
        return ad;
    }
}

Я запрашиваю в MainActivity в OnCreate:

AdManager adManager = new AdManager(MainActivity.this);
adManager.createAd();

Я показываю это в другом действии - ViewItemActivity - перед setContentView:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AdManager adManager = new AdManager(ViewItemActivity.this);
    InterstitialAd ad = adManager.getAd();
    if (ad.isLoaded()) {
        ad.show();
    }

    setContentView(R.layout.activity_view_item);

....

....

Я снова запрашиваю, когда пользователь нажимает кнопку «Назад»: - ViewItemActivity

@Override
public void onBackPressed(){
AdManager adManager = new AdManager(ViewItemActivity.this);
adManager.createAd();
super.onBackPressed();
}

В результате я не получаю ошибку в эмуляторе или реальном смартфоне при попытке по отдельности, но в Google PlayКонсоль разработчика Я получаю десятки исключений нулевого указателя. Как я могу решить мою проблему?

1 Ответ

1 голос
/ 05 октября 2019

Я не думаю, что шаблон синглтона подходит для вашего случая использования. Вы пытаетесь создать новое объявление для каждого контекста, поэтому нет смысла сохранять его в разных экземплярах AdManager. Вы можете изменить AdManager на следующее и удалить все вызовы на createAd.

public class AdManager {

    private InterstitialAd ad;
    private Context ctx;

    public AdManager(Context ctx) {
        this.ctx = ctx;
    }

    private void createAd() {
        // Create an ad.
        ad = new InterstitialAd(ctx);
        ad.setAdUnitId(App.getResourses().getString(R.string.interstitial_ad_unit));

        final AdRequest adRequest = new AdRequest.Builder().build();

        // Load the interstitial ad.
        ad.loadAd(adRequest);
    }

    public InterstitialAd getAd() {
        if (ad == null) {
            createAd();
        }
        return ad;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...