由于Admob广告,Recyclerview滞后滚动

我想在RecyclerView广告中加载广告已成功加载,但它在滚动时滞后很多

以下是我在Adapter的OnBindViewHolder方法中编写的代码

如何解决这个滞后问题?

((DealHolder) holder).adcardView.post(new Runnable() {
                @Override
                public void run() {
                    final NativeExpressAdView adView = new NativeExpressAdView(((DealHolder) holder).itemView.getContext());
                    final int adWidth = ((DealHolder) holder).adcardView.getWidth() - ((DealHolder) holder).adcardView.getPaddingLeft()
                            - ((DealHolder) holder).adcardView.getPaddingRight();
                    final int adHeight = ((DealHolder) holder).adcardView.getHeight() - ((DealHolder) holder).adcardView.getPaddingBottom()
                            - ((DealHolder) holder).adcardView.getPaddingTop();
                    final float scale = ((DealHolder) holder).adcardView.getResources().getDisplayMetrics().density;
                    AdSize adSize = new AdSize((int) (adWidth / scale), (int) (adHeight / scale));
                    adView.setAdSize(adSize);
                    adView.setAdUnitId(((DealHolder) holder).adcardView.getContext().getString(R.string.test_adunit_id));
                    AdRequest request = new AdRequest.Builder().addTestDevice("jjhjhbjhjhjhjhjhjhjh").build();
                    adView.loadAd(request);
                    adView.setAdListener(new AdListener() {
                        @Override
                        public void onAdLoaded() {
                            super.onAdLoaded();
                        }

                        @Override
                        public void onAdFailedToLoad(int i) {
                            super.onAdFailedToLoad(i);
                        }
                    });
                    ((DealHolder) holder).adcardView.removeAllViews();
                    ((DealHolder) holder).adcardView.addView(adView);
                }
            });

改进:

  • 当用户尝试滚动时,不要尝试加载Adview。 要做到这一点,使您的适配器recylerView滚动察觉,然后检查scroll_state==RecylerView.Scroll_IDLE ,然后只加载您的AdView。

  • 如果所有广告视图都具有相同的宽度和高度,则每次用户滚动时都不计算它,请将其缓存在变量中。

  • 不要动态添加和删除NativeExpressAdView,请在item_view中为其使用XML版本。 您可以根据条件隐藏和显示。 在XML视图中设置所有可能的必需属性。


  • 我认为问题在于您不使用主线程来显示广告。

    我会建议在onViewAttachedWindow执行此onViewAttachedWindow 。 因为当功能触发时,布局管理器已经有了它的过程,比如测量和替换项目等。

    通过这种方式,您不需要使用其他线程,主线程也不会被阻止,并且recyclerview将顺利滚动。


    为每个视图持有者创建一个新的AdView将会非常耗资源。

    而不是在每个视图持有者上创建新的广告视图,在特定时间间隔后为adview充气,例如每5或10个项目之后。

  • 创建两种不同的布局,用于带有广告的适配器和不带广告的另一种布局。

  • 重写getItemViewType()方法

  • public int getItemViewType(int position) { if (position % 10 == 0){ // Ad after every 10 items return 0; //use integer constant to identify view type is Adview. } return super.getItemViewType(position); }

  • 在OnCreateViewHolder()方法中

    @Override public ViewHolderClass onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 0){ // Constant for Adview View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_row_with_ads, parent,false); return new ViewHolderClass(view, viewType); } View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_row, parent,false); return new ViewHolderClass(view); }

  • 在你的ViewholderClass中创建一个参数为View和int的第二个构造器

    public class ViewHolderClass extends RecyclerView.ViewHolder{ ... public ViewHolderClass(View view){ ... } public ViewHolderClass(View view, int viewType){ ... // Initialize your adview here }

  • 为您的布局。 如果你的adapter_row.xml如下所示:

  • <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp" >
    
        <android.support.v7.widget.CardView
            android:id="@+id/base"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            // your main content
        </android.support.v7.widget.CardView>
    </RelativeLayout>
    
  • 然后使用这些更改为适配器adapter_row_with_ads.xml创建另一个布局文件。
  • <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp" >
    
        <android.support.v7.widget.CardView
            android:id="@+id/base"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            // your main content
    
        </android.support.v7.widget.CardView>
    
          <!--This is where you'll add your AdView-->
          <com.google.android.gms.ads.AdView
              android:id="@+id/adView"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_below="@id/base"/>
    
    </RelativeLayout>
    

    这种方法将减少电池排水和资源消耗,并且您的应用程序将更加流畅

    链接地址: http://www.djcxy.com/p/39965.html

    上一篇: Recyclerview lag on scroll due to Admob ads

    下一篇: Multi GPU/Tower setup Tensorflow 1.2 Estimator