Попытка вызвать метод интерфейса для нулевой ссылки на объект в реализации admob libgdx - PullRequest
0 голосов
/ 23 апреля 2019

Я внедряю баннерную рекламу admob в игру libgdx.Я сделал несколько экранов и хочу показывать рекламные баннеры на каждом экране.Я реализовал баннерную рекламу в классе запуска и пытался показать его в классе экрана через вызов метода интерфейса, но приложение каждый раз вылетает с ошибкой.

4-22 20:47:14.466 24246-24280 / com.mygdx.game E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: GLThread 80476

Process: com.mygdx.game, PID: 24246
java.lang.NullPointerException: Attempt to invoke interface method 'void com.mygdx.game.AdsController.showBannerAd()' on a null object reference
    at com.mygdx.game.BabyOrange.create(BabyOrange.java:51)
    at com.mygdx.game.BabyScreen.<init>(BabyScreen.java:38)
    at com.mygdx.game.BabyOrange.<init>(BabyOrange.java:42)
    at com.mygdx.game.BabyGame.create(BabyGame.java:9)
    at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:311)
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1633)
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1354)

Вот код для модуля запуска и класса экрана

public class BabyOrange extends BabyScreen {

private BabyActor bg;
private BabyActor ph;

private AdsController adsController;

public BabyOrange(Game g,AdsController adsController){
   super(g);
   this.adsController = adsController;


}

 public void create () {
   adsController.showBannerAd();

    bg = new BabyActor();
    bg.setTexture(asset.get("background-orange.png",Texture.class));
    bg.setSize(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());

    ph = new BabyActor();
    ph.setTexture(asset.get("orange-ph.png",Texture.class));
    ph.setSize(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());

 }

Вот интерфейс

public interface AdsController {
public void showBannerAd();
public void hideBannerAd();
 }

И класс запуска Android

public class AndroidLauncher extends AndroidApplication implements AdsController{

private static final String BANNER_ID = "ca-app-pub-959117648XXXXXX/XXXXXXXX";
AdView bannerAd;
@Override
protected void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();

    //create a gameView and a bannerAd AdView
    View gameView = initializeForView(new BabyGame(), config);

    setupAds();

    //define the layout
    RelativeLayout layout = new RelativeLayout(this);
    layout.addView(gameView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    layout.addView(bannerAd,params);
    setContentView(layout);
}

public void setupAds(){
    bannerAd = new AdView(this);
    bannerAd.setVisibility(View.INVISIBLE);
    bannerAd.setAdUnitId(BANNER_ID);
    bannerAd.setAdSize(AdSize.SMART_BANNER);
}

@Override
public void showBannerAd() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            bannerAd.setVisibility(View.VISIBLE);
            AdRequest.Builder builder = new AdRequest.Builder();
            AdRequest ad = builder.build();
            bannerAd.loadAd(ad);
        }
    });
}

@Override
public void hideBannerAd() {

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            bannerAd.setVisibility(View.INVISIBLE);
        }
    });
}

}

1 Ответ

0 голосов
/ 07 мая 2019

Ваш супер-конструктор вызывает базовую функцию create до того, как установлен ваш adsController.Попробуйте этот код:

public BabyOrange(Game g,AdsController adsController){
    super(g);
    this.adsController = adsController;
    create2();
}

public void create2() {
    adsController.showBannerAd();
}

public void create () { // called within super-constructor
    bg = new BabyActor();
    bg.setTexture(asset.get("background-orange.png",Texture.class));
    bg.setSize(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());

    ph = new BabyActor();
    ph.setTexture(asset.get("orange-ph.png",Texture.class));
    ph.setSize(Gdx.graphics.getWidth(),Gdx.graphics.getHeight());

}

...
...