2016-06-16 48 views
4

我在應用程序中遇到了一些性能問題(UI渲染會暫時凍結),做了一些挖掘,發現PublisherAdView.loadAd()方法需要大約500-700ms才能在Nexus 5上執行應用程序啓動和100-200ms在後續運行。我預計最壞的情況是10-15毫秒。PublisherAdView在Android上的loadAd性能問題

爲了驗證這一點,我從這裏下載橫幅例子:https://developers.google.com/mobile-ads-sdk/docs/dfp/android/banner和修改MainActivity執行loadAd()在一個單獨的方法方法:

private PublisherAdView mAdView; 
private PublisherAdRequest adRequest; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 

    mAdView = (PublisherAdView) findViewById(R.id.ad_view); 

    adRequest = new PublisherAdRequest.Builder().build(); 

    loadAd(); 
} 

private void loadAd(){ 

    long start = System.currentTimeMillis(); 

    // Start loading the ad in the background. 
    mAdView.loadAd(adRequest); 

    long end = System.currentTimeMillis(); 

    Log.d("MyActivity", "loadAd took "+(end - start)+" ms"); 
} 

當有更多的廣告展示的問題變得更加明顯同時(文章開頭處的橫幅,以下介紹的矩形廣告...)以及UI凍結半秒甚至更長時間,直到它們被加載。

在滾動期間顯示RecyclerView中的廣告和UI凍結時,這也是問題,直到加載廣告。

我在這裏丟失了什麼,或者這確實是PublisherAdView問題?

回答

1

我有類似的體驗,adMob使用webviews,在Android設備上效率極低,並且對CPU徵稅。初始的長時間加載時間是Android連接到Chromium插件以啓動webview會話。一旦在記憶中它會改善。在列表/回收站視圖中使用時最明顯。

我使用的方法是在碎片和活動中顯示橫幅一次。刷新可在廣告服務器端進行配置。我會避免將廣告插入列表中(例如將廣告插入到每個第n個元素中),但是如果必須的話,請使用view.setTag記錄標誌以指示廣告已加載。

此標誌實際上可能是廣告加載的時間。然後在您的recyclerview的bindViewHolder中使用該標記,或在常規listView中使用getItem來確定廣告是否已加載。如果廣告已經被加載,那麼只顯示當前的內容/佈局,否則如果它已經過期(以30秒的任意時間量),或者沒有設置該值,則發送loadAd請求),但是然後你再次表現出色。

因此,當用戶滾動時,滾動性能逐漸提高,因爲每次列表元素被實例化時都不會繼續請求廣告。另外,當使用片段時,確保您的廣告是否爲PublisherAdView.pause(),特別是如果它位於onDestroyView期間的viewpager中。