2013-06-25 20 views
5

Chcę załadować moje dodanie na wątku tła, ponieważ powoduje opóźnienie przy otwieraniu i zamykaniu SlidingMenu. Czy powinienem używać modelu Thread/Handler? Lub AsyncTask?Ładowanie reklamy (AdMob) na wątku tła

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

Nie wierzę, że można to zrobić, ponieważ wszystkie rzeczy związane z interfejsem użytkownika muszą być wykonane na głównym wątku – tyczj

+0

, ale czy nie ma tam części, która jest pobierana przez sieć? – KickingLettuce

+1

tak, jest to, co jest zrobione w API prawdopodobnie w osobnym wątku, ponieważ Android rzuci 'NetworkOnMainThreadException' jeśli jakiekolwiek rzeczy związane z siecią zostaną wykonane na głównym wątku – tyczj

Odpowiedz

2

Nie wierzę, że można to zrobić, ponieważ wszystkie tematy związane z interfejsem użytkownika muszą być wykonane w głównym wątku. API prawdopodobnie ma już wątek, aby uzyskać reklamę w sieci. Jeśli to zrobił android byłoby rzucić NetworkOnMainThreadException jeśli sieć podobne rzeczy odbywa się na głównym wątku

+0

zgodził się, myślałem, że jakoś możemy oddzielić działanie sieci i działanie interfejsu, ale myliłem się. Robią oba w jednym wywołaniu api. –

9

Można to osiągnąć poprzez załadowanie reklamę na UI wątek przez runOnUiThread

nazywają to od onCreate()

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

loadAd() sposób

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

To działa, ale nie jestem pewien, czy faktycznie rozwiązuje problem, o którym mowa. Ponieważ działa w interfejsie użytkownika, nadal powoduje opóźnienie innych elementów interfejsu użytkownika. – lenooh

+0

Notka dla każdego, kto będzie googlował: Zaczęłam dostawać błędy "Wykonywanie zatrzymania aktywności, które nie zostało wznowione: { /com.google.android.gms.ads.AdActivity} ...' podczas używania to. – lenooh

+0

Mimo to będzie działał z wątkiem tła, ponieważ AdMob musi aktualizować reklamy z serwera Google. To tylko drobna korekta. – zackygaurav

3

Należy zastosować metodę MobileAds.initialize() przed załadowaniem reklam. Po tym loadAd działa szybciej

+0

Lepiej jest umieścić odpowiednie informacje z linku w odpowiedzi, a także, aby odpowiedź była nadal przydatna, jeśli link zostanie zerwany. – MackM

Powiązane problemy