2016-12-25 2 views
1

ich drei LinearLayout Ansichten haben, wo ich einige meiner eigenen Ansichten wie die laden:Wie kann ich wissen, wenn mehrere Ansichten gerendert werden

linearLayout1.addView(view11); 
linearLayout1.addView(view12); 
linearLayout2.addView(view21); 
linearLayout2.addView(view22); 
linearLayout3.addView(view31); 
linearLayout3.addView(view32); 

Das Problem ist, dass, wenn ich viele Ansichten laden müssen (mehr als 30) Die Leistung sinkt. Konkret geschieht dies:

Ich beginne die Aktivität, die Aktivität wird gerendert, ich lade von der lokalen SQLite die erforderlichen Daten auf dem Bildschirm geladen und ich fange an, meine benutzerdefinierten Ansichten zu den linearen Layouts hinzuzufügen.

An diesem Punkt die App einfrieren und nach 2-3 Sekunden erscheinen alle meine benutzerdefinierten Ansichten alle zusammen.

Ich habe versucht, eine Log innerhalb jeder benutzerdefinierten Ansicht onMeasure und ich fand heraus, dass jede Ansicht tatsächlich fast zur gleichen Zeit (< 1ms Unterschied zwischen ihnen) bereit ist.

Ich bin auf der Suche nach einer Möglichkeit zu wissen, wann alles fertig ist und der Benutzer wieder mit der Benutzeroberfläche interagieren kann.

Speziell, ich möchte eine ProgressDialog zeigen, wenn die Aktivität beginnt und ausblenden nach diesen 2-3 Sekunden, wenn der Bildschirm für den Benutzer bereit ist.

Irgendwelche Ideen?

Würde es auch die Gesamtleistung unterstützen, wenn ich meine LinearLayouts durch ListViews ersetze und benutzerdefinierte Adapter hinzufüge, um meine benutzerdefinierten Ansichten anstelle von addView hinzuzufügen?

+0

Ja! Verwenden Sie LinearLayout nicht einmal ScrollView zum Rendern mehrerer Ansichten. Verwenden Sie einfach eine einzelne ListView. –

+0

@teckwei hätte das wirklich großen Einfluss auf die Leistung? sogar für viel mehr Ansichten (sagen wir 200)? – TheCrafter

+2

Haben Sie Twitter-Feed, Facebook-Feed gesehen? Sie alle verwenden listView, selbst wenn Sie 1000 View haben, können sie es gut rendern, nur weil sie die Wiederverwendungstechnik verwenden. Es bedeutet, dass deine Ansicht nicht wirklich in der Erinnerung ist oder nicht existiert, wenn sie nicht sichtbar sind. Sie erstellen oder wiederverwenden, sobald Sie zum möglichen scrollen. Aber Sie haben viel mehr Arbeit, wenn Sie viel Unterschied Layout haben. –

Antwort

0

Ja sicher, Sie müssen RecyclerView oder ListView mit Halter Muster verwenden. Sie verwenden dieselbe Ansicht (Wiederverwendung) zum Anzeigen von Inhalten.

Die Erstellung neuer Ansichten ist eine kostspielige Arbeit und wird die Leistung beeinträchtigen. Wenn Sie verschiedene Arten von Ansichten haben, können Sie mehrere Ansichten für Ihre RecyclerView definieren.

This könnte Ihnen helfen.

Durch Hinzufügen von Ansichten wird auch die übergeordnete Ansicht ungültig. Jedes Mal, wenn Sie eine neue Ansicht innerhalb Ihrer ViewGroup hinzufügen, muss ViewGroup neu gezeichnet werden.

+0

Ja, ich fürchte, ich habe einen Fehler gemacht, als ich 'LinearLayout' wählte. Hast du eine Idee, wie man ein Ereignis erhält, wenn alle Ansichten gerendert werden, damit ich es patchen kann, bis ich die gesamte Aktivität umgestaltet habe? – TheCrafter

+0

Es besteht die Möglichkeit, dass Sie OOM (Nicht genügend Arbeitsspeicher) erhalten, bevor Sie alle Ansichten erstellt haben. – Rahul

+0

Ich kenne die OOM-Abkürzung nicht. Was heißt das? – TheCrafter

Verwandte Themen