2013-06-25 8 views
5

Desidero caricare il mio add in un thread in background perché rende lo SlidingMenu lento in apertura e in chiusura. Devo usare un Thread/Handler? O AsyncTask?Caricamento annuncio (adMob) su thread in background

String MY_AD_UNIT_ID = "----"; 
AdView adView = new AdView(getActivity(), AdSize.BANNER, MY_AD_UNIT_ID); 
final LinearLayout adLayout = (LinearLayout) getActivity() 
      .findViewById(R.id.adLayout); 
adLayout.addView(adView); 
adView.loadAd(new AdRequest()); 
+0

Non credo che questo possa essere fatto in quanto tutte le cose relative all'interfaccia utente devono essere fatte sul thread principale – tyczj

+0

ma non c'è una parte di esso che recupera la rete? – KickingLettuce

+1

sì c'è che viene fatto nell'API probabilmente in un thread separato perché Android genererà un 'NetworkOnMainThreadException' se qualsiasi cosa relativa alla rete viene fatta sul thread principale – tyczj

risposta

2

Non credo che questo possa essere fatto poiché tutte le cose relative all'interfaccia utente devono essere fatte sul thread principale. L'API probabilmente ha già una discussione per ottenere l'annuncio sulla rete. Se Android non ha ancora getterebbe una NetworkOnMainThreadException eventuale cose relative rete è fatto sul thread principale

+0

d'accordo, ho pensato che in qualche modo potremmo separare l'operazione di rete e l'operazione dell'interfaccia utente, ma ho sbagliato. Fanno entrambi in una singola chiamata API. –

9

Ciò può essere ottenuto caricando l'annuncio sulla UI thread runOnUiThread

chiamata questo da onCreate()

Thread adThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      loadAd(); 
     } 
    }; 
    adThread.start(); 

loadAd() metodo

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

Funziona, ma non sono sicuro che risolva effettivamente il problema in questione. Mentre viene eseguito sull'interfaccia utente, causa ancora un ritardo degli altri elementi dell'interfaccia utente. – lenooh

+0

Solo una nota per chiunque abbia cercato su Google: Ho iniziato a ricevere degli errori "Esecuzione della fermata dell'attività non ripresa: { /com.google.android.gms.ads.AdActivity} ..." quando si utilizza Questo. – lenooh

+0

Sarà comunque eseguito su Thread in background perché AdMob deve aggiornare gli annunci dal server di Google. È solo un piccolo ritocco. – zackygaurav

3

È necessario utilizzare il metodo MobileAds.initialize() prima di caricare gli annunci. Dopo che loadAd funziona più velocemente

+0

È meglio mettere le informazioni rilevanti dal link anche nella risposta, in modo che la risposta sia ancora utile se il collegamento si interrompe un giorno. – MackM