为什么我在 UI 线程上运行时会收到“必须在主 UI 线程上调用 setAdListener”

S. *_*ell 0 android admob

我正在尝试向我的游戏添加插页式广告。它建立在书本的框架之上。构造函数是:

 public GameScreen(Game game) {
        super(game);
        world = new World();
        clueLetters = new String[10];
        levelNo = SettingsObject.levelUnlock;
        getWord();
        interstitialAd = new InterstitialAd(AndroidGame.context);
        interstitialAd.setAdUnitId("ca-app-pub-1861496496821617/");

        //Create an ad request
        AdRequest.Builder adRequestBuilder = new AdRequest.Builder();

        AndroidGame.activityReference.runOnUiThread(new Runnable() {
            @Override
            public void run()

            {
                // Set AdListener
                interstitialAd.setAdListener(new AdListener() {
                    @Override
                    public void onAdClosed() {
                        super.onAdClosed();
                    }
                });
            }
        });

        Looper.prepare();
        interstitialAd.loadAd(adRequestBuilder.build());

    }
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

 java.lang.IllegalStateException: setAdListener must be called on the main UI thread.
Run Code Online (Sandbox Code Playgroud)

你能告诉我为什么我会收到这个错误以及如何解决它吗?

Nan*_*tey 5

我使用类似/相同的框架。最好的方法是在 AndroidGame 活动类中设置插页式广告,并使用一个界面在您的游戏屏幕中显示广告:

首先创建接口类:

public interface MyActivityListener {
    public void showInterstitial();
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 AndroidGame 类中,实现接口:

public abstract class AndroidGame extends Activity implements Game, MyActivityListener {
  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        interstitialAd = new InterstitialAd(AndroidGame.context);
        interstitialAd.setAdUnitId("ca-app-pub-1861496496821617/");
        //Create an ad request
        AdRequest.Builder adRequestBuilder = new AdRequest.Builder();
        interstitialAd.loadAd(adRequestBuilder.build());

                // Set AdListener
                interstitialAd.setAdListener(new AdListener() {
                    @Override
                    public void onAdClosed() {
                        super.onAdClosed();
                    }
                });
        }

@Override
    public void showInterstitial() {
        runOnUiThread(new Runnable() {   
            @Override
            public void run() {
                if(interstitialAd != null && interstitialAd.isLoaded())
                   interstitialAd.show();       
            }
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,任何时候你想在 any 中展示广告screen,你只需调用该showInterstitial()方法。游戏画面中的示例:

public class GameScreen extends Screen{
    MYActivityListener mL;
public GameScreen(Game game) {
        super(game);
        mL = (MyActivityListener)game;
        world = new World();
        clueLetters = new String[10];
        levelNo = SettingsObject.levelUnlock;
        getWord();
        mL.showInterstitial();
    }

}
Run Code Online (Sandbox Code Playgroud)

我使用这个实现来完成所有需要在 UI 线程上运行的工作(隐藏和显示横幅广告、评价/分享应用程序、存储分数等。希望它有帮助:)