Recyclerview-Verzögerung bei Scroll aufgrund von Admob-Anzeigen

7

Ich möchte Anzeigen in RecyclerView-Anzeigen laden, die erfolgreich geladen wurden, aber beim Scrollen so viele Verzögerungen verursachen

Es folgt Code, den ich in OnBindViewHolder Methode von Adapter

geschrieben habe

Wie behebt man diese Verzögerung?

%Vor%     
apk 04.07.2017, 19:34
quelle

3 Antworten

3

Verbesserungen:

  1. Versuchen Sie nicht, Adview zu laden, wenn der Benutzer versucht, einen Bildlauf durchzuführen. Dazu machen Sie Ihren Adapter recylerView scroll bewusst und prüfen dann, ob der scroll_state==RecylerView.Scroll_IDLE , dann lade nur dein AdView.

  2. Wenn alle Ihre adViews dieselbe Breite und Höhe haben, berechnen Sie sie nicht jedes Mal, wenn der Benutzer scrollt, cachen Sie ihn in einer Variablen.

  3. Anstatt NativeExpressAdView dynamisch hinzuzufügen und zu entfernen, verwenden Sie in Ihrer item_view eine XML-Version. Sie können basierend auf Bedingungen ausblenden und anzeigen. Legen Sie alle möglichen erforderlichen Attribute in der XML-Ansicht fest.

krishan 08.07.2017 10:03
quelle
0

Ich denke, das Problem ist, dass Sie keinen Haupt-Thread verwenden, um die Anzeigen anzuzeigen.

Ich würde dies in onViewAttachedWindow empfehlen. Denn wenn die Funktion ausgelöst wurde, hatte der Layout-Manager bereits seinen Prozess wie Messen und Ersetzen von Elementen usw.

Auf diese Weise müssen Sie keinen anderen Thread verwenden und der Hauptthread wird nicht blockiert und die Recycleransicht wird reibungslos durchlaufen.

    
ziLk 05.07.2017 13:05
quelle
0

Das Erstellen eines neuen AdView für jeden Ansichtshalter wäre ziemlich ressourcenhungrig.

Anstatt eine neue Anzeigenansicht für jeden Ansichtshalter zu erstellen, blenden Sie die Ansicht nach einem bestimmten Intervall auf, z. B. nach jeweils 5 oder 10 Elementen.

  • Erstellen Sie zwei verschiedene Layouts, die in Adapter eins mit Anzeigen und in anderen ohne Anzeigen verwendet werden.

  • Überschreiben Sie die getItemViewType () -Methode

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); }

  • in der OnCreateViewHolder () -Methode

    @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); }

  • Erstellen Sie in Ihrer ViewholderClass einen zweiten Konstruktor mit den Parametern View und int

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

  • Für Ihre Layouts. Wenn Ihre adapter_row.xml wie folgt aussieht:

%Vor%
  • Erstellen Sie dann mit diesen Änderungen eine andere Layoutdatei für den Adapter adapter_row_with_ads.xml.
%Vor%

Dieser Ansatz verringert die Batterieentleerung und den Ressourcenverbrauch und Ihre App wird reibungsloser

    
Mohammed Junaid 12.07.2017 17:02
quelle