2013-06-25 20 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

是的,有可能是在一個單獨的線程中完成的API,因爲如果任何網絡相關的東西在主線程上完成,android會拋出一個'NetworkOnMainThreadException' – tyczj

回答

2

我不相信這可以做到,因爲所有與UI相關的東西都必須在主線程上完成。 API可能已經有了一個線程來獲取網絡上的廣告。如果它,如果任何網絡相關的東西是主線程

+0

同意,我想我們可以分開網絡操作和用戶界面操作,但我錯了。他們都做單一的API調用。 –

9

這可以通過加載在UI線程的廣告可以實現從onCreate()

完成由 runOnUiThread

調用此didnt機器人會拋出一個NetworkOnMainThreadException

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

這可行,但我不確定它是否真的解決了問題。當它在UI上運行時,它仍然會導致其他UI元素滯後。 – lenooh

+0

只是一個筆記給任何人googling這個:我開始收到錯誤'執行停止活動,不恢復:{ /com.google.android.gms.ads.AdActivity} ...'使用時這個。 – lenooh

+0

由於AdMob需要更新來自Google服務器的廣告,它無論如何都會在後臺主題上投放。這只是一個小小的調整。 – zackygaurav

3

在廣告加載之前,您應該使用MobileAds.initialize()方法。之後,loadAd工作更快

+0

最好從鏈接中的相關信息放在答案中,以便如果鏈接有一天中斷,答案仍然有用。 – MackM