Quellcode auslesen .. Schleife ?!

L

lucaaAUT

Neues Mitglied
0
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
 
OBWOHL ich programmiert habe das er nach jeden mal auslesen was ausgeben soll
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
 
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
 
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.
 
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
 
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
 
  • Danke
Reaktionen: lucaaAUT
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
 
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
 
  • Danke
Reaktionen: lucaaAUT
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?
 
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 ;-)
 
  • Danke
Reaktionen: lucaaAUT
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;
    }
    
}
 

Ähnliche Themen

H
Antworten
2
Aufrufe
1.306
Hcman
H
M
  • maksimilian
Antworten
8
Aufrufe
1.266
jogimuc
J
A
  • Andy12345678
Antworten
7
Aufrufe
1.069
BOotnoOB
BOotnoOB
Zurück
Oben Unten