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