2016-08-16 80 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

相關問題