2013-06-25 11 views
5

Ich möchte meine Add auf einem Hintergrund Thread laden, weil es die SlidingMenu laggy beim Öffnen und Schließen macht. Sollte ich eine Thread/Handler verwenden? Oder AsyncTask?Loading Ad (adMob) auf Hintergrund Thread

+0

Ich glaube nicht, dass dies getan werden kann, da alle UI verwandten Sachen auf dem Hauptthread getan werden müssen – tyczj

+0

aber gibt es nicht einen Teil davon, der über das Netzwerk holt? – KickingLettuce

+1

ja es gibt was in der API wahrscheinlich in einem separaten Thread getan wird, weil Android eine "NetworkOnMainThreadException" werfen wird, wenn Netzwerk-bezogene Sachen auf dem Haupt-Thread – tyczj

Antwort

2

Ich glaube nicht, dass dies getan werden kann, da alle UI verwandten Sachen auf dem Hauptthread getan werden müssen. Die API hat wahrscheinlich bereits einen Thread, um die Anzeige im Netzwerk zu erhalten. Wenn es würde nur knapp sein Ziel android eine NetworkOnMainThreadException werfen, wenn eine netzwerkbezogene Sachen auf dem Haupt-Thread ausgeführt wird

+0

vereinbart, ich dachte, irgendwie könnten wir den Netzwerkbetrieb und UI-Betrieb trennen, aber ich habe mich geirrt. Sie tun beide in Einzel-API-Anruf. –

9

Dies kann durch runOnUiThread

Aufruf dieser von onCreate()

durch das Laden der Anzeige auf UI-Thread erreicht werden
Thread adThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      loadAd(); 
     } 
    }; 
    adThread.start(); 

loadAd() Methode

private void loadAd() 
{ 
    // Banner Ad 
    final AdView adview = (AdView) this.findViewById(R.id.adview); 

    // Request for ads 
    final AdRequest adRequest = new AdRequest.Builder() 
      // Time for test devices 
      .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
      .addTestDevice("xxxxxxxxxxxxxxxxxxxxxxx") 
      .addTestDevice("xxxxxxxxxxxxx") 
      .build(); 

    // Load Ads on UI Thread 
    runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      adview.loadAd(adRequest); 
     } 
    }); 
} 
+0

Das funktioniert, aber ich bin mir nicht sicher, ob es tatsächlich das Problem löst. Da es auf der Benutzeroberfläche ausgeführt wird, verursacht es weiterhin andere Benutzeroberflächenelemente zu verzögern. – lenooh

+0

Nur ein Hinweis für jeden, der dies googelt: Ich fing an, Fehler zu erhalten 'Ausführen von Stop der Aktivität, die nicht fortgesetzt wird: { /com.google.android.gms.ads.AdActivity} ...' bei der Verwendung Dies. – lenooh

+0

Es wird sowieso auf Hintergrund-Thread ausgeführt, da die AdMob die Anzeigen vom Google-Server aktualisieren muss. Es ist nur ein kleiner Tweak. – zackygaurav

3

Sie sollten die Methode MobileAds.initialize() vor dem Laden von Anzeigen verwenden. Danach funktioniert loadAd schneller

+0

Es ist besser, die relevanten Informationen aus dem Link in Ihrer Antwort zu setzen, so dass die Antwort immer noch nützlich ist, wenn die Verbindung eines Tages bricht. – MackM