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

Quellcode auslesen .. Schleife ?!

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

  1. lucaaAUT, 31.08.2011 #1
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Hallo,

    Ich will den Quellcode einer Seite auslesen (z.B. Google.de), um danach etwas herauszufiltern..

    Es soll ungefähr so funktionieren:

    Schleife{

    Quellcode auslesen;
    Quellcode filtern;
    Das herausgefilterte ausgeben;

    }

    Ich versuche den Quellcode so auszulesen:

    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;
        }
    Allerdings ist da folgendes Problem. Das Auslesen des Quellcodes wird vor allen anderem ausgeführt. z.B. Ich habe ein Label. Wo beim Start des Programmes "..." stehen sollte. Also ich sage bevor er den Quellcode auslesen soll soll er "..." in das Label schreiben. In die Schleife schreibe ich eine For-Schleife mit Counter 5. OBWOHL ich programmiert habe das er nach jeden mal auslesen was ausgeben soll, ließt er 5 mal hintereinander den Quellcode aus Ohne dazwischen oder davor etwas zu machen.

    ICH BIN TOTAL VERZWEIFELT !!!

    Ich stecke seit knapp einer Woche bei dem Problem.

    Kann mir Bitte wer einen Tipp geben ?

    lg lucaaAUT , Danke
     
  2. sixi, 31.08.2011 #2
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    Ich vermute du meinst damit deinen TextView (o.ä.) füllen? Wenn ja, dann liegt es daran, dass du mit deinem Auslesen des Quelltextes den UI-Thread blockierst - daher erfolgt die Aktualisierung erst verzögert.

    So in etwa sollte es funktionieren:

    Code:
     private class DownloadFilesTask extends AsyncTask<URL, Void, String> {
         protected String doInBackground(URL... urls) {
             return makeRequest(urls[0]);
         }
         protected void onPostExecute(String... result) {
             #result anzeigen lassen
         }
     }
    
    ...
    AsyncTask t = new DownloadFilesTask();
    t.execute(deineURL);
    
    Beispiel von androidapi:AsyncTask
     
  3. lucaaAUT, 01.09.2011 #3
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Hallo,

    Danke für die Antwort. Ich bin leider neu in Java und kann desshalb nicht so viel mit dem Code anfangen :(

    Eine neue Class erstellen mit dem Namen "DownloadFilesTask" und dem Code
    Code:
    private class DownloadFilesTask extends AsyncTask<URL, Void, String> {
         protected String doInBackground(URL... urls) {
             return makeRequest(urls[0]);
         }
         protected void onPostExecute(String... result) {
             #result anzeigen lassen
         }
     }
    
    ?

    und im Hauptprogramm

    Code:
    AsyncTask t = new DownloadFilesTask();
    t.execute(deineURL);
    Aber vielen Dank für die Antwort :)))

    lg
     
  4. sixi, 01.09.2011 #4
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    Das ist eine Möglichkeit.

    Du kannst das ganze auch als "Anonyme Inline Klasse" verwenden (tue ich immer, wenn der AsyncTask nur an einer Stelle genutzt wird):

    Code:
    AsyncTask myTask = new AsyncTask<URL, Void, String>(){
      ...
    }.execute();
    
    vgl. Java ist eine Insel: Innere Klassen

    Allgemein sehr zu empfehlen:
    Android:Responsiveness
    sowie der Rest der "Best Practices". Dort wird die UI-Thread Problematik erklärt.
     
  5. JanF, 01.09.2011 #5
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
  6. lucaaAUT, 03.09.2011 #6
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Hallo,

    Okay ich bin jetzt einen kleinen Schritt weiter.

    Code:
    public class Test_httpclientActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        
        AsyncTask myTask = new AsyncTask<URL, Void, String>(){
        	
        	protected String doInBackground(URL... urls) {
    				return makeRequest(urls[0]);                 //  <- Fehler
            }
            protected void onPostExecute(String... result) {
            
            	Toast.makeText(Test_httpclientActivity.this,"FERTIG", Toast.LENGTH_SHORT).show();
            }
                
        }.execute();
        
        public static String makeRequest(URL urls) throws Exception {
            final String TAG = "HttpClient";
            String str = "";
    
            try {
                DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpGet httpost = new HttpGet(urls);                           // <- Fehler
    
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                str = (String) httpclient.execute(httpost, responseHandler);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            return str;
        }
        
    }
    Okay.. Ich versteh das ganze noch nicht ganz.
    Kann den Code einer erklären ? Dafür wäre ich echt dankbar :)
    Will ihn ja verstehen auch :p

    lg
     
  7. sixi, 03.09.2011 #7
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    1. übergibst du der "execute()"-Methode keine Parameter - die erwartet "URL... urls", also ein Array von URLs --> NullPointer urls[0] sowie HttpGet(urls);
    2. wirst du 'nen problem kriegen, wenn du den AsyncTask so als Klassenvariable deklarierst, da er vor der "onCreate" ausgeführt wird -> sobald du auf ein Textview schreibst wird dieses null sein, da das Layout noch nich gesetzt ist --> schieb den ganzen Block hoch in die onCreate-Methode
     
    lucaaAUT bedankt sich.
  8. lucaaAUT, 03.09.2011 #8
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Gut,
    Also wenn ich das richtig verstanden habe sollte das so Aussehen?

    Code:
    public class Test_httpclientActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            AsyncTask myTask = new AsyncTask<URL, Void, String>(){
            	
            	protected String doInBackground(URL... urls) {
        				return makeRequest(urls[0]);
                }
                protected void onPostExecute(String... result) {
                
                	Toast.makeText(Test_httpclientActivity.this,"FERTIG", Toast.LENGTH_SHORT).show();
                }
                    
            }.execute(urls[0]);
        }
        
        
        
        public static String makeRequest(URL urls) throws Exception {
            final String TAG = "HttpClient";
            String str = "";
    
            try {
                DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpGet httpost = new HttpGet(urls[0]);
    
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                str = (String) httpclient.execute(httpost, responseHandler);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            return str;
        }
        
    }
    Noch eine Frage: Wie rufe ich die Funktion auf das ich das Ergebnis also den Quellcode der Seite bekomme?

    lg
     
  9. sixi, 03.09.2011 #9
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    Das Ergebnis ist ja das von dem makeRequest-Aufruf. Also entweder hast du es in dem doInBackground (returnst es da aber sofort weiter an die onPostExecute). Dort steht es in result[0].

    Sinnvoll wäre es halt noch den Quellcode in der doInBackground oder direkt in deiner makeRequest zu verarbeiten (außer du willst den reinen Quellcode irgendwo anzeigen, aber ich geh mal davon aus, dass du nur Teile davon verwenden willst), da du dich an den Stellen noch in einem Thread im Hintergrund bewegst. Würdest du es in der onPostExecute-Methode machen, dann kriegst du unter Umständen Probleme mit laggender UI
     
    lucaaAUT bedankt sich.
  10. lucaaAUT, 03.09.2011 #10
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Hallo, Danke das du mir hilfst :)

    Okay ich werde den Quellcode gleich in der makeRequest Funktion bearbeiten.
    (Da der Code zu lang wäre um ihn hier zu posten werde ich ihn mit "// Quellcode bearbeiten") abkürzen:

    Code:
    public class Test_httpclientActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
    		AsyncTask myTask = new AsyncTask<URL, Void, String>(){
            	
            	protected String doInBackground(URL... urls) {
        				return makeRequest(urls[0]);
                }
                protected void onPostExecute(String... result) {
                
                	Toast.makeText(Test_httpclientActivity.this, result[0] , Toast.LENGTH_SHORT).show();
                }
                    
            }.execute(urls[0]);  <- FEHLER(1)
        }
        
        
        
        public static String makeRequest(URL urls) throws Exception {
            final String TAG = "HttpClient";
            String str = "";
    
            try {
                DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpGet httpost = new HttpGet(urls[0]); <- FEHLER(2)
    
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                str = (String) httpclient.execute(httpost, responseHandler);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            
            /*
             * Quellcode bearbeiten! Code blablabla
             */
                
            return str;
        }
        
    }
    FEHLER(1) = "urls cannot be resolved into a variable"
    FEHLER(2) = "The type of the expression must be an array type but it resolved to URL"

    Okay langsam versteh ich das ganze schon... Es ist logisch. Nur was die 2 Fehler bedeuten weiß ich nicht O.o Kannst du mir da weiterhelfen?
     
  11. sixi, 03.09.2011 #11
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    1: genau wie es in der Fehlermeldung steht: du übergibst der execute eine Variable, die es nicht gibt.

    2: HttpGet hat 3 public Constructor: leer, URI oder String. Und URI ist was anderes als URL... da sollte eigentlich eclipse schon mit dir meckern ;-)
     
    lucaaAUT bedankt sich.
  12. lucaaAUT, 03.09.2011 #12
    lucaaAUT

    lucaaAUT Threadstarter Junior Mitglied

    Beiträge:
    36
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2011
    Okay ,
    Ich habe jetzt versucht die Fehler zu beheben. Leider hatte ich keinen Erfolg.
    Es existieren jetzt zwar keine Fehler mehr aber funktionieren tut es nicht...

    Code:
    package com.test.luca;
    import android.os.AsyncTask;
    import org.apache.http.client.ResponseHandler;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.BasicResponseHandler;
    import org.apache.http.impl.client.DefaultHttpClient;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    import android.widget.Toast;
    
    
    public class Test_httpclientActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
    		URL myurl = null;
    		try {
    			myurl = new URL( "http://www.google.de" );
    		} catch (MalformedURLException e) {
    			e.printStackTrace();
    		}
    
    		
    		AsyncTask<URL, Void, String> myTask = new AsyncTask<URL, Void, String>(){
            	
            	protected String doInBackground(URL... myurl) {
    							try {
    								return makeRequest(myurl.toString());
    							} catch (Exception e) {
    								// TODO Auto-generated catch block
    								e.printStackTrace();
    							}
    							return null;
                }
                protected void onPostExecute(String... result) {
                
                	Toast.makeText(Test_httpclientActivity.this, result[0] , Toast.LENGTH_SHORT).show();
                }
                    
            }.execute(myurl);
        }
        
        
        
        public static String makeRequest(String myurl) throws Exception {
            final String TAG = "HttpClient";
            String str = "";
    
            try {
                DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpGet httpost = new HttpGet(myurl);
    
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                str = (String) httpclient.execute(httpost, responseHandler);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            /*
             * Quellcode bearbeiten! Code blablabla
             */
            return str;
        }
        
    }
    
    
    
     

Diese Seite empfehlen