2014-07-08 2 views
12

Ich arbeite in einem Projekt, das ein einfaches Tutorial aufblasen muss, wenn der Benutzer die App zum ersten Mal öffnet. Ich versuche es "richtig" zu machen und frage mich nach dem Leistungsproblem.Android-Leistung: Hinzufügen der Ansicht programmgesteuert vs Einstellungsansicht zu GONE/VISIBLE

Momentan habe ich in meinem Layout eine Sicht auf android:visibility="GONE" gesetzt, die ich je nach SharedPreference auf VISIBLE umstelle. So kann ich den Nutzer erfahren lassen, wie die App beim ersten Start funktioniert.

Ich frage mich, was es bedeutet, wenn die Ansicht in meinem Fragment gerendert wird. Meine Vermutung ist, dass die Ansicht nutzlos aufgeblasen wird, auch wenn ihre Sichtbarkeit auf GONE gesetzt ist.

Jetzt denke ich über eine Alternative nach: Was wäre, wenn ich meine Ansicht nur bei ersten Starts hinzufügen würde, aber programmatisch in meinem Fragment onCreateView. Das sollte ermöglichen, dass die Ansicht bei späteren Starts nicht aufgeblasen wird, aber würde die Ansicht nicht aufblasen, bedeutet dies eine schlechte Leistung bei den ersten Starts?

+0

Nicht sicher über Leistungsvergleich. Aber wenn es wirklich so etwas wie Tutorial auf den ersten Lauf, dann geben Sie [Showcase View] (https://github.com/amlcurran/ShowcaseView) einen Versuch :) –

+0

@PurpleDroid Nun, ich zeige es tatsächlich als ein 'CardView' jetzt sofort. Es ist nur ein FYI zum ersten Mal Benutzer, nicht wirklich ein Tutorial! :-) – MagicMicky

+0

@MagicMicky: Sorry, aber ich muss fragen "Was hast du probiert?". Es ist sehr einfach, DDMS zu verwenden, um den Fortschritt einer App mithilfe von logcat zu verfolgen. Warum versuchst du nicht einfach die verschiedenen Ansätze selbst und siehst, was passiert? – Squonk

Antwort

7

Also, um meine eigene Frage zu beantworten, habe ich das DDMS-Tool TraceView verwendet, um die Anrufe von meinem Fragment onAttach bis zu seiner onResume zu überwachen. Es ließ mich sehen, welche Implementierung weniger effizient ist.

Um den Test zu machen, hatte ich eine einfache RelativeLayout mit einer FrameLayout drin (gezeigt die ganze Zeit). Ich habe jedes Mal ein benutzerdefiniertes Layout verwendet, entweder programmgesteuert oder mit einer Sichtbarkeit von GONE in meiner Layout-Datei. Das benutzerdefinierte Layout bestand aus einem RelativeLayout mit 4 Childs (einem ImageView, einem TextView, einem View und einem Button).

Meine onCreateView war die folgende, so dass die App das richtige Layout basierend auf zwei static final boolean Konstanten aufblasen kann, um die Layouts zu ändern.

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    LinearLayout root; 
    if(INFLATE_PROGRAMMATICALY) { 
     root = (LinearLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false); 
     if(SHOULD_FYI_VIEW_BE_SHOWN) { 
      View tutoView = inflater.inflate(R.layout.inner_view, root, false); 
      root.addView(tutoView); 
     } 
    } else { 
     root = (LinearLayout) inflater.inflate(R.layout.fragment_test_gone,container,false); 
     if(SHOULD_FYI_VIEW_BE_SHOWN) { 
      View tutoView = root.findViewById(R.id.RL_inner_view); 
      tutoView.setVisibility(View.VISIBLE); 
     } 
    } 
    return root; 
} 

Dies führt zu folgenden Ergebnissen:

Wenn das optionale Layout in aufgeblasenen

SHOULD_FYI_VIEW_BE_SHOWN=true

Die maximale "Echtzeit Schätzung" der Traceview gegeben ist 75ms wenn nur eine Ansicht von GONE auf 0 zu ändern ist, aber von 110 ms wenn wir die inner_view instanziieren müssen.

Wenn das optionale Layout SHOULD_FYI_VIEW_BE_SHOWN=false

In diesem Fall nicht aufgeblasen wird, die maximale Echtzeit-Schätzung von Traceview gegeben ist von 102ms für die Inflation der GONE Ansicht, im Vergleich zu 39MS wenn die Ansicht aufgebläht nicht die GONE Ansicht hat.

Also, für die Leistungssteigerung, wenn die Ansichten nicht aufgeblasen werden müssen, würde ich sagen, dass die beste Lösung ist, um Ihre Ansicht programmatisch aufzublasen, wenn Sie es nur ein paar Mal zeigen müssen.

Sie können das Testprojekt auf einem finden Gist

1

Ich denke, ich zufällig zufällig über die Antwort Ihrer Leistungsfrage gestolpert.

Vom Animation Docs:

Für die Ansicht, die in verblasste wird, setzen Sie seine Sichtbarkeit zu GONE. Diese verhindert, dass die Ansicht Layout-Raum belegt und es aus dem Layout Berechnungen, die Beschleunigung der Verarbeitung weglässt.

Diese Leistung bedeuten würde, ist nicht so lange beeinträchtigt, da Sie nicht android:visibility auf etwas anderes als GONE gesetzt haben.

4

Ich glaube, Sie ein Rad neu zu erfinden. Für dieses Szenario ist bereits ein Tool in Android XML-Layouts vorhanden. Es heißt ViewStub. Sie können mehr hier lesen: Loading ondemand