1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Auslesen einer Webseite beschleunigen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ChrisMobile, 22.09.2011.

  1. ChrisMobile, 22.09.2011 #1
    ChrisMobile

    ChrisMobile Threadstarter Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Hallo zusammen,

    ich hab einen standard-Block, den ich in meinen Apps nutze um etwas von einer Webseite auszulesen.
    Der Code funktioniert an sich sehr gut, nur leider läuft das Auslesen meiner Meinung nach sehr langsam.

    Ich hab nun ein bisschen rumgebastelt und nach Alternativen gesucht aber irgendwie war noch nichts dabei, was wirklich spürbar schneller geht.

    Code:
        /**
         * Liefert die angegebene Webseite als String zurück.
         *
         * @return HTML der Webseite.
         */
        private String getSourceCode() {
            URL url = null;
            try {
                url = new URL(wantedURL);
            } catch (MalformedURLException e) {
                writeErrorLogOnSD(e);
                e.printStackTrace();
            }
            URLConnection conn = null;
            try {
                conn = url.openConnection();
            } catch (IOException e) {
                writeErrorLogOnSD(e);
                e.printStackTrace();
            } catch (NullPointerException e) {
                writeErrorLogOnSD(e);
                e.printStackTrace();
            }
            // editText.getText().toString()
            BufferedReader rd = null;
            try {
                rd = new BufferedReader(
                        new InputStreamReader(conn.getInputStream()));
            } catch (IOException e) {
                writeErrorLogOnSD(e);
                e.printStackTrace();
            } catch (NullPointerException e) {
                writeErrorLogOnSD(e);
                e.printStackTrace();
            }
    
            String line = "";
            String oldLine = "";
            if (rd != null) {
                System.out.println("Got Line");
                try {
                    while ((line = rd.readLine()) != null) {
                        oldLine = oldLine + line;
                    }
                } catch (IOException e) {
                    writeErrorLogOnSD(e);
                    e.printStackTrace();
                }
                try {
                    rd.close();
                } catch (IOException e) {
                    writeErrorLogOnSD(e);
                    e.printStackTrace();
                }
            } else {
                System.out.println("No Line");
                error = true;
            }
    
            return oldLine;
        }
    
    Wäre cool, wenn ihr ein paar Geheim-Tipps in der Hinterhand habt, oder gibt es wirklich nichts, dass "deutlich" schneller ist?

    Viele Grüße
    Chris
     
  2. Fr4gg0r, 22.09.2011 #2
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    StringBuilder einsetzen (tut sonst der Compiler führ dich, aber ineffizient. Der erstellt dann nämlich im Schleifenrumpf jedes mal einen neuen).
     
  3. ChrisMobile, 23.09.2011 #3
    ChrisMobile

    ChrisMobile Threadstarter Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Danke für den Tipp, das Herunterladen der Daten geht nun im Schnitt 4x schneller!

    Hab die beiden Funktionen gerade direkt verglichen und auf der selben Webseite dauert es mit dem Code ohne StringBuilder ca. 4000ms (mehrfach getestet) und mit dem StringBuilder nur noch ca. 1000ms (teilweise sogar nur 800ms).

    Hier kommt nochmal der neue Code für die Nachwelt:
    Code:
                    /*
                    while ((line = rd.readLine()) != null) {
                        oldLine = oldLine + line;
                    }
                    */
                    StringBuilder sb = new StringBuilder();
                    while ((line = rd.readLine()) != null) {
                        //oldLine = oldLine + line;
                        sb.append(line);
                    }
                    oldLine =  sb.toString();
    
    Viele Grüße
    Chris
     
  4. funcoder, 24.09.2011 #4
    funcoder

    funcoder Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    Wem die Ursachen für das "Phänomen" interessieren, dem empfehle ich einen Blick auf diesem Blog-Artikel zu werfen.
    Lohnt sich! Performance ist nun mal ein wichtiger Nennwert bei der User-Experience und entscheidet nicht selten ob eine Applikation beim Benutzer ankommt oder aber direkt deinstalliert wird.
     
    Tom299 und ChrisMobile haben sich bedankt.

Diese Seite empfehlen