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

Quellcode auslesen funktioniert, aber nicht in Schleife ?!

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von lucaaAUT, 22.08.2011.

  1. lucaaAUT, 22.08.2011 #1
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Hallo, Ich möchte bei meiner App den Quellcode einer Seite auslesen.
    Es funktioniert, aber auch irgendwie nicht.
    Code:
    Code:
    try {            
            	URL url_ = new URL("http://www.lolsignup.co.de/");
        		URLConnection conn = url_.openConnection();
        		DataInputStream in = new DataInputStream ( conn.getInputStream (  )  ) ;
        		BufferedReader d = new BufferedReader(new InputStreamReader(in, "iso-8859-15"));
        		String content = "";
        		while(d.ready())
        		{
        			content += d.readLine();
        		}
    Einmalig auslesen klappt wunder bar. Aber auch da kommt mir vor Führt das Programm das auslesen vor allem anderen durch. z.B. Ich habe ein Label mit dem Standardtext "Dies ist ein Test". Starte ich nun mein Programm, ist das Label leer, solange bis der Quellcode fertig ausgelesen wurde. Dann kommt erst "Dies ist ein Test" als Text auf das Label.

    Mit Schleife (was für mein Programm notwendig ist) funktioniert es nicht. Wenn ich zum Beispiel eine For-Schleife mit 3 Durchgängen mache ließt er 3 mal hintereinander ohne was anderes zu machen den Quellcode aus (was er ja nicht tun soll weil ich ja nach jeden Durchgang etwas aus dem Quellcode herausfiltern will)..

    Wieso geht das nicht , bzw Wie kann man das ändern?

    lg Lucaa! :)
     
  2. ko5tik, 22.08.2011 #2
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Niemand hat dir versprochen das es arbeiten würde:
    Code:
    True if the next read() is guaranteed not to block for input,  false otherwise.  Note that returning false does not guarantee that the  next read will block. 
    
    Und bitte, tue so etwas nicht
    Code:
    content += d.readLine();
    
    Dafür werden die Entwickler gelyncht.
     
  3. lucaaAUT, 22.08.2011 #3
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    okay...

    Danke erstmal, Aber gibt es eine andere Möglichkeit?
    Wieso werden Sie gelyncht ? :p

    lg
     
  4. ko5tik, 22.08.2011 #4
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Warum nimmst du nicht dem HttpClient (welches standartmäßig da ist, und alles richtig tut)?

    Zum 2. Frage: da String immutabel ist, artet string += string in eine Speicherzuweisungsorgie
    mit herumkopieren - was für die Performance eher hinderlich ist.
     
    lucaaAUT bedankt sich.
  5. lucaaAUT, 22.08.2011 #5
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Super Danke :)
    Super erklärt :)

    lg lucaaAUT
     
  6. Fr4gg0r, 23.08.2011 #6
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Soweit ich weiß, baut der Compiler das so um:
    String content;
    while(d.ready()){
    StringBuilder sb = new StringBuilder();
    sb.append(content).append(d.readLine());
    content = sb.toString();
    }

    Dann ist auch ersichtlich warum das Mist ist. ;)
     
  7. v Ralle v, 23.08.2011 #7
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Bleibt die Frage, ob er es wirklich so umbaut?! ^^ Kann man sich da sicher sein?
     
  8. Fr4gg0r, 23.08.2011 #8
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Code:
    .method public foobar(Ljava/io/BufferedReader;)V
        .locals 3
        .parameter "d"
        const-string v0, ""
    
        .line 95
        .local v0, content:Ljava/lang/String;
        :goto_2
        invoke-virtual {p1}, Ljava/io/BufferedReader;->ready()Z
    
        move-result v1
    
        if-nez v1, :cond_9
    
        .line 98
        return-void
    
        .line 96
        :cond_9
        new-instance v1, Ljava/lang/StringBuilder;
    
        invoke-static {v0}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String;
    
        move-result-object v2
    
        invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
    
        invoke-virtual {p1}, Ljava/io/BufferedReader;->readLine()Ljava/lang/String;
    
        move-result-object v2
    
        invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    
        move-result-object v1
    
        invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
    
        move-result-object v0
    
        goto :goto_2
    .end method
    meine java rekonstruktion:
    while(d.ready()){
    StringBuilder sb = new StringBuilder(String.valueOf(content));
    sb.append(d.readLine());
    content = sb.toString();
    }
    durch den valueOf() Aufruf ist der Code also noch langsamer als oben geschrieben. ;)
     
    v Ralle v bedankt sich.
  9. v Ralle v, 24.08.2011 #9
    v Ralle v

    v Ralle v Android-Lexikon

    Beiträge:
    913
    Erhaltene Danke:
    199
    Registriert seit:
    27.08.2010
    Danke :) Sehr interessant.
     
  10. lucaaAUT, 27.08.2011 #10
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Hallo, Ich habe jetzt erst leider wieder Internet.
    Ich bin Leider noch ein Anfänger und mir sagst das im Moment überhaupt nichts.
    Kann mir wer Links oder einen Code geben?

    Wäre echt super danke ;)
     
  11. lucaaAUT, 28.08.2011 #11
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Kann mir keiner mehr helfen? :(

    lg Luca

    #Edit:

    Ich habs jetzt mit der Funktion versucht:

    Code:
    public static String makeRequest(String path) throws Exception {
            final String TAG = "HttpClient"; //Used in logging etc.
            String str = "";
    
            try {
                DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpGet httpost = new HttpGet(path);
    
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                str = (String) httpclient.execute(httpost, responseHandler);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            return str;
        }
    
    Und es geht noch immer nicht :(
     
    Zuletzt bearbeitet: 28.08.2011

Diese Seite empfehlen