2016-08-16 1 views
0

Ich versuche, Interstitial-Anzeigen zu meinem Spiel hinzuzufügen. Es ist auf einem Rahmen aus einem Buch gebaut. Der Konstruktor ist:Warum bekomme ich 'setAdListener muss auf dem Haupt-UI-Thread aufgerufen werden', wenn ich es auf dem UI-Thread ausführen

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

    } 

Allerdings habe ich den Fehler:

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

Können Sie mir sagen, warum ich diese Störung erhalte und wie man es beheben, bitte?

Antwort

3

Ich benutze die ein ähnliches/gleichen Rahmen. Der beste Weg ist es, die Interstitial-Anzeigen in der AndroidGame Aktivitätsklasse einzurichten und zu verwenden, um eine Schnittstelle, um die Anzeigen in Ihrem Spiel Bildschirm zeigen:

zuerst die Interface-Klasse erstellen:

public interface MyActivityListener { 
    public void showInterstitial(); 
} 

dann in Ihre AndroidGame Klasse, implementieren die Schnittstelle:

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

    } 
} 

Damit jedes Mal, wenn Sie Anzeigen in jeder screen zeigen wollen, erhalten Sie nur Rufen Sie die showInterstitial() Methode an. Beispiel in Ihrem Spiel-Bildschirm:

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

} 

ich diese Implementierung verwenden, um alle zu tun, die auf dem UI-Thread (verstecken und zeigen, Bannerwerbung, Rate/share App erfordert läuft, Speicherung Noten usw. Hoffe, es hilft:)

+0

Das ist brilliant, danke. Es klappt. Trotzdem würde ich gerne wissen, warum ich den Fehler bekommen habe, den ich bekommen habe. –

+0

Das ist ziemlich alt, aber ich war einfach in der gleichen Situation. Wie sich herausstellte, musste ich den neuen AdRequest.Builder() verschieben; innerhalb der Runnable, um es zu lösen. – Pierre

Verwandte Themen