2016-08-16 74 views
0

我正在尝试向我的游戏添加插页式广告。它建立在一本书的框架之上。构造函数是:为什么当我在UI线程上运行它时,必须在主UI线程上调用'setAdListener'

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()); 

    } 

但是,我得到的错误:

java.lang.IllegalStateException: setAdListener must be called on the main UI thread. 

你能告诉我为什么我收到的错误,以及如何解决它,好吗?

回答

3

我使用类似/相同的框架。最好的办法是在AndroidGame活动课来建立插页广告,并使用一个接口来显示你的游戏画面的广告:

首先创建接口类:

public interface MyActivityListener { 
    public void showInterstitial(); 
} 

然后在您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();  
      } 
     }); 

    } 
} 

有了这个,你想在任何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(); 
    } 

} 

我用这个实现要做到这一点需要在UI线程(隐藏上运行的所有工作,并显示横幅广告,速度/股的应用程序,存储分数等希望它帮助: )

+0

这太棒了,谢谢。有用。但是,我仍然想知道为什么我得到了我得到的错误。 –

+0

这是相当古老的,但我只是发生在相同的情况。事实证明,我必须移动新的AdRequest.Builder();在Runnable内部命令解决它。 – Pierre

相关问题