2016-04-09 15 views
0

Ich habe den folgenden Code zum dynamischen Hinzufügen von Schaltflächen für jedes Element in der Toylist-Objekt toyCatalog, die 46 Elemente lang ist.Dynamisch Hinzufügen von Schaltflächen in Android-Programm

toyCatalog = new ToyList(content, length); 

     LinearLayout ll = (LinearLayout)findViewById(R.id.layout); 
     int numToys = toyCatalog.getNumOfToys(); 

     for(int i =0; i<numToys; i++){ 
      System.out.println("adding button " + i); 
      Button myButton = new Button(this); 
      myButton.setText("New Toy"); 
      LayoutParams lp = new LayoutParams(MATCH_PARENT, WRAP_CONTENT); 
      ll.addView(myButton, lp); 
     } 

aber wenn ich versuche, um den Code auszuführen, erhalte ich

I/Choreographer: Skipped 43 frames! The application may be doing too much work on its main thread. 

Und nur drei Tasten auf der Seite angezeigt. Wie verwalte ich die Arbeit am Haupt-Thread, damit ich dynamisch Schaltflächen hinzufügen kann?

+0

Ihr Code zum Programmieren einer Schaltfläche ist in Ordnung. Nichts ist falsch damit. Wie der Logcat sagt, scheint in deinem Hauptthread viel los zu sein. Meine Frage: Wo befindet sich dieser Codeausschnitt in Ihrer Anwendung? Können Sie den gesamten Code mit der Methode oder Klasse angeben, zu der er gehört? – ljpv14

Antwort

0

Die Nachricht, die Sie sehen, hängt möglicherweise nicht mit Ihrem Code zusammen. Es ist unmöglich, mit dem von Ihnen bereitgestellten Snippet sicher zu sein. Aber es gibt einen, den Sie tun können, um ihn zu optimieren.

Suchen Sie die übergeordnete Ansicht nur einmal. Bewegen Sie diesen Code außerhalb der Schleife und beziehen Sie sich einfach auf ll. Es gibt keinen Grund, an jedem der Eltern zu finden Iteration:

LinearLayout ll = (LinearLayout)findViewById(R.id.layout); 

Sie können auch dann ungültig Aufruf getNumOfToys bei jeder Iteration, indem sie es in einer Variablen zu speichern und verwenden, die in Ihrer for-Schleife. Es sieht so aus, als ob bereits ein length Wert verfügbar ist, also benutze das vielleicht stattdessen.

Überprüfen Sie auch, wie oft diese Schleife funktioniert. Zu viele Iterationen werden sicherlich ein Problem verursachen.

Schließlich sicherstellen, dass Ihr LinearLayout eine vertikale Ausrichtung hat, so dass die Schaltflächen übereinander gestapelt sind. Die standardmäßige horizontale Ausrichtung zeigt nur eine Schaltfläche an.

+0

Ich habe die ursprüngliche Frage bearbeitet, um Ihre Änderungen wiederzugeben, aber immer noch das gleiche Problem mit übersprungenen Frames. –

+0

Wie gesagt, der Code hier ist möglicherweise nicht für die Nachricht verantwortlich, die Sie sehen. Es ist unmöglich, das sicher zu wissen. Die einzige Möglichkeit, um sicher zu sein, ist, dass Sie einen Profiler gegen die App ausführen und nach Methoden suchen, die lange dauern. –

0

Ich denke nicht, es ist verwandt und Sie müssen immer Ansichten auf den Haupt-Thread hinzufügen, so dass Sie nicht viel tun können. Was zeigt die System.out.println?

Verwandte Themen