2015-02-13 6 views
6

aufgerufen werden, nachdem Benutzer William mir empfehlen, auf dieseAdMob Interstitial und Fehler isLoaded muss auf dem Haupt-UI-Thread

Interstitial-Anzeige der Code geändert werden dieses
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    //setDebugMode(true); 
    initialiseAccelerometer(); 

    interstitial = new InterstitialAd(this); 
    interstitial.setAdUnitId(getResources().getString(R.string.InterstitialAd_unit_id)); 

    interstitial.setAdListener(new AdListener() { 
     public void onAdClosed() { 
      // Create another ad request. 
      final AdRequest adRequest = new AdRequest.Builder() 
       .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
       .build(); 
      interstitial.loadAd(adRequest); 
     } 
    }); 
    // Create ad request. 
    final AdRequest adRequest = new AdRequest.Builder() 
      .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
      .build(); 
    interstitial.loadAd(adRequest); 
} 

und zur Anzeige Anzeige für die Ansicht:

public synchronized void GameOver() { 
    if (lives_left > 0) { 
     //success! - game passed - save score 
     ScoreManager.save_localscore_simple(score_times[currentLevel], "" + currentLevel, false); 

     if (Level_Buttons.length >= currentLevel + 1) 
      ScoreManager.save_localscore_simple(unlocked, "unlock" + (currentLevel + 1)); 

     if (sound_success != 0 && !sound_muted) 
      sp.play(sound_success, 1, 1, 0, 0, 1); 

     //open interstitial ad 
     if (interstitial.isLoaded()) { 
      interstitial.show(); 
     } 


    } else { 
     //game not passed 
     if (sound_gameover != 0 && !sound_muted) 
      sp.play(sound_gameover, 1, 1, 0, 0, 1); 
    } 


    //open interstitial ad 
    if (interstitial.isLoaded()) { 
     interstitial.show(); 
    } 

    StopMusic(); 
    state = GAMEOVER; 

} 

auf jedem Gameover in Spiel bekomme ich diesen Fehler:

W/dalvikvm(20469): threadid=11: thread exiting with uncaught exception  (group=0x4180bda0) 
E/AndroidRuntime(20469): FATAL EXCEPTION: Thread-67543 
E/AndroidRuntime(20469): Process: com.test.mygame, PID: 20469 
E/AndroidRuntime(20469): java.lang.IllegalStateException: isLoaded must be  called on the main UI thread. 
E/AndroidRuntime(20469): at  com.google.android.gms.common.internal.bh.b(SourceFile:251) 
E/AndroidRuntime(20469): at com.google.android.gms.ads.internal.b.e(SourceFile:345) 
E/AndroidRuntime(20469): at com.google.android.gms.ads.internal.client.m.onTransact(SourceFile:66) 
E/AndroidRuntime(20469): at android.os.Binder.transact(Binder.java:361) 
E/AndroidRuntime(20469): at com.google.android.gms.internal.ap$a$a.isReady(Unknown Source) 
E/AndroidRuntime(20469): at com.google.android.gms.internal.au.isLoaded(Unknown Source) 
E/AndroidRuntime(20469): at com.google.android.gms.ads.InterstitialAd.isLoaded(Unknown Source) 
E/AndroidRuntime(20469): at com.test.mygame.MainGame.GameOver(MainGame.java:1128) 
E/AndroidRuntime(20469): at com.test.mygame.MainGame.Step(MainGame.java:773) 
E/AndroidRuntime(20469): at com.test.nudge.Screen.run(Screen.java:207) 
E/AndroidRuntime(20469): at java.lang.Thread.run(Thread.java:841) 

Was ist hier falsch? Bitte erkläre mir das so einfach wie möglich, denn ich bin Neuling ohne Programmierkenntnisse vorher :) Danke!

Antwort

11

Dies ist vielleicht nicht die vollständige Antwort, aber es ist schwer, die richtige Antwort zu sagen, weil es aus Deinem obigen Code nicht klar ist. Sie haben nicht gezeigt, wo Sie GameOver() verwenden, aber ich denke, Sie haben es an der falschen Stelle aufgerufen, ich denke, Sie nennen es in einem Hintergrund-Thread, weil in GameOver Sie rufen interstitial.isLoaded(), die Ihr Problem verursachen. Wie der Stacktrace sagte, rufen Sie ihn im Hauptthread auf. Für exqample, rufen Sie diese in Ihrem Gameover():

runOnUiThread(new Runnable() { 
     @Override public void run() { 
      if (interstitial.isLoaded()) { 
       interstitial.show(); 
     } 
     } 
    }); 

Möglicherweise müssen Sie nennen es mit einer Aktivität Referenz, es hängt davon ab, wo Sie rufen Sie Gameover():

mYourActivity.runOnUiThread(new Runnable() { 
     @Override public void run() { 
      if (interstitial.isLoaded()) { 
       interstitial.show(); 
     } 
     } 
    }); 
+0

Oh, wirkt wie ein Zauber! :) Du hast meinen Tag gemacht, weil ich nach einer Lösung gesucht habe, um die Interstitial-Verzögerung für etwa 2 Wochen zu entfernen! Ich danke dir sehr! – Karnak

0

Teile meinem Fall und Lösung.

Ich habe einen neuen Thread und Aufruf isLoaded(). Es hat denselben Fehler bekommen. Damit löse ich es per untenstehendem Code mit Messager.

Hoffe diese Hilfe.

Code wie folgt.

Haupt thread:

public void onCreate() { 

     mHandler = new Handler(Looper.getMainLooper()) { 
      @Override 
      public void handleMessage(Message message) { 
       switch (message.what) { 
        case ACTION_ADMOB_IS_LOADED: 
         MainActivity.logForDebug(TAG,"AdMob : Check for loaded"); 
         if(mIAds.isLoaded()) { 
          MainActivity.logForDebug(TAG,"AdMob : Loaded ...... OK"); 
          mIAds.show(); 
         } 
         break; 
       } 


      } 
     }; 

} 

Andere Gewinde

public void run(){ 

     while(true){ 
       Message message; 
       // ------ For AdMob ------ 
       Message message = mHandler.obtainMessage(ACTION_ADMOB_IS_LOADED,null); 
       message.sendToTarget(); 
        } 
     }