2013-06-25 5 views
5

Я хочу загрузить свое добавление в фоновый поток, потому что он делает ловушку SlidingMenu при открытии и закрытии. Должен ли я использовать Thread/Handler? Или AsyncTask?Загрузка объявления (adMob) в фоновом режиме

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

Я не верю, что это можно сделать, поскольку все связанные с UI вещи должны быть сделаны по основному потоку – tyczj

+0

, но разве нет его части, которая извлекается по сети? – KickingLettuce

+1

yes есть, что сделано в API, вероятно, в отдельном потоке, потому что андроид будет вызывать 'NetworkOnMainThreadException', если какая-либо связанная с сетью работа выполняется в основном потоке – tyczj

ответ

2

Я не верю, что это можно сделать, поскольку все материалы, связанные с пользовательским интерфейсом, должны выполняться на основной теме. У API, вероятно, уже есть поток, чтобы получить объявление в сети. Если оно не андроид бы бросить NetworkOnMainThreadException если материал, относящийся к сети осуществляется в основном потоке

+0

согласился, я подумал, что мы можем разделить работу сети и работу с пользовательским интерфейсом, но я ошибался. Они делают оба в одном вызове api. –

9

Это может быть достигнуто путем загрузки объявлений на UI тему на runOnUiThread

Вызова этого из onCreate()

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

loadAd() метод

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

Это работает, но я не уверен, действительно ли он решает проблему. Поскольку он работает в пользовательском интерфейсе, он все еще заставляет другие элементы пользовательского интерфейса отставать. – lenooh

+0

Просто примечание для тех, кто придумал это: я начал получать ошибки 'Выполнение остановки активности, которая не возобновляется: { /com.google.android.gms.ads.AdActivity} ...' при использовании это. – lenooh

+0

В любом случае он будет запускаться в фоновом потоке, потому что AdMob должен обновить объявления с сервера Google. Это всего лишь небольшая настройка. – zackygaurav

3

Перед загрузкой объявлений вы должны использовать метод MobileAds.initialize(). После этого loadAd работает быстрее

+0

Лучше также поместить соответствующую информацию из ссылки в свой ответ, чтобы ответ по-прежнему был полезен, если связь когда-нибудь ломается. – MackM

Смежные вопросы