2016-08-16 10 views
0

インタースティシャル広告をゲームに追加しようとしています。これは、本のフレームワーク上に構築されています。コンストラクタは次のとおりです。UIスレッドで「setAdListenerをメインUIスレッドで呼び出す必要があります」というメッセージが表示される

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

関連する問題