3 Stimmen

Android TextView Langsam bei Verwendung von append() Hunderte Male - Lösung?

Ich habe einen Quellcode-Editor für Android und ich habe einen Zeilennummernzähler, der links von dem Haupt-EditText mit dem Quellcode darin steht.

Ich habe die folgende Funktion, die ich zum Aktualisieren des Zeilennummern-Textfelds verwende:

String lineDelimiter = "\n";
public void updateLineNumbers(){
    int lines = textBox.getLineCount();
    lineNums.setText(1 + lineDelimiter);
    for(int i = 2; i < lines; i++){
      lineNums.append(i + lineDelimiter);
    }
}

All das ist gut, aber das Problem tritt auf, wenn Sie ein Dokument mit etwa 200 Zeilen haben, fangen Sie an, eine kleine Verzögerung beim Hinzufügen von Zeilen zu bemerken. Liegt das daran, dass die setText/append Methoden von Android TextView ein wenig langsam sind? Oder ist es die Verkettung, die die Verzögerung verursacht?

Ich habe auch eine ähnliche Funktion gemacht, die eine Zeilennummer anfügt, wenn der Benutzer eine Zeilennummer hinzufügt, und umgekehrt, anstatt das TextView zu leeren und wie die oben genannte Funktion jede Zeilennummer hinzuzufügen. Aber auch diese Funktion verlangsamt die App, wenn der Benutzer Zeilen hinzufügt/entfernt.

Wie kann ich das stoppen? Ich weiß nicht, was ich tun soll, und es macht mich fertig, weil es meine App verlangsamt und für große Dateien unbrauchbar macht! :(

Vielen Dank fürs Lesen!


LÖSUNG

Ich habe einen Weg gefunden, um schnelle Zeilennummern zu haben, und zwar indem ich einen benutzerdefinierten TextView mit überschriebener onDraw(Canvas canvas) verwende und auf diese Weise die Zeilennummern zeichne, was zu einer verzögerungsfreien Anzeige der Zeilennummern führt :).

1voto

CommonsWare Punkte 950864

Ist das der Grund, warum die setText/append Methoden von Android TextView ein wenig langsam sind? Oder ist es die Verkettung, die die Verzögerung verursacht?

Verwenden Sie Traceview und finden Sie es heraus.

Vermutlich wird das mehrmalige Aufrufen von append() auf einem TextView wesentlich langsamer sein als das mehrmalige Aufrufen von append() auf einem StringBuilder und dann einmal das setText() auf dem TextView zu rufen.

Wie kann ich das stoppen?

Behandeln Sie die Zeilennummern nicht auf diese Weise. Setzen Sie zum Beispiel ein TextView links von dem EditText und platzieren Sie Ihre Zeilennummern in dem TextView, eine pro Zeile.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X