HTML Code von Website abrufen

darman96

Aktives Mitglied
Hallo,

ich muss für eine App die ich im moment programmiere den HTML Code einer website abrufen.
Dafür hab ich den Code hier gefunden:

Java:
HttpClient http = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = http.execute(httpget);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
StringBuilder builder = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null) {
	builder.append(line);
}

sourceCode = builder.toString();
stream.close();

Die App schmiert aber leider immer beim ausführen von httpget ab.
hat jemand ne idee was der fehler ist?
 
Das Problem ist soweit kommt das Programm gar nicht erst
ich hab um den ganzen block ein Try/Catch aber wenn ich im Catch part was ausgeben will kommt der gar nicht erst da hin.

Java:
try {
        	HttpClient client = new DefaultHttpClient();
        	HttpGet get = new HttpGet("http://www.google.de");
        	HttpResponse response = client.execute(get);		
        	HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder builder = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null ) {
            	builder.append(line);
            }
            sourceCode = builder.toString();
        } catch (ClientProtocolException e) {
			e.printStackTrace();
			Log.e("ERROR", e.getMessage());
		} catch (IOException e) {
			e.printStackTrace();
			Log.e("ERROR", e.getMessage());
		}
 
Füge einen allgemeinen catch Block hinzu (fange alle anderen Exceptions).
Entweder läuft dein Code durch und tut aber nicht dass was du willst oder es fliegt eine Exception die nicht gefangen wird von deinem try/catch.
Der catch Part wird auch erst ausgeführt wenn wirklich eine Exception geflogen ist.
 
also es ist so wenn ich die App debugge und am Anfang des Try blocks einen Breakpoint setzte kommt der erst mal bis zu dem punkt und dann bin ich mit Step Over weiter gesprungen. Damit komme ich bis hier :
Java:
HttpResponse response = client.execute(get);
. Wenn ich dann nochmal weisterspringe geht der irgendwo rein und da steht nur noch Source not found. das macht der dann drei vier schritte nochmal und dann schmiert die app komplett ab.
 
An dieser Stelle solltest du schon (in der Debug-Ansicht) die Exception sehen. Ansonsten einfach ein
try {...} catch(Exception e) { Log.e("TEST", e.getMessage(), e); }
um das #execute herum.

Egal ob dieser brachiale try-catch-Block oder ordentliches Debuggen: Eigentlich solltest du nach der Zeit den Grund für deine Exception schon gefunden haben...

Hier ein leicht angepasstes Beispiel aus meinen Code - der auch funzt.
Java:
	public static boolean uploadResult(String request, String xml, String referenceServer, int port, String cgiPath, String uploadTarget, String mobileIp) {
		
		HttpParams httpParameters = new BasicHttpParams();
		HttpConnectionParams.setConnectionTimeout(httpParameters, 10000);
		HttpConnectionParams.setSoTimeout(httpParameters, 15000);

		HttpClient httpClient = new DefaultHttpClient(httpParameters);
		HttpPost postRequest = new HttpPost(request);

		try {
			postRequest.setHeader("Content-Type", "application/xml");
			postRequest.setEntity(new StringEntity(xml));
		} catch (UnsupportedEncodingException ue) {
			android.util.Log.e(Utils.class.getSimpleName() + ":uploadResult", "UnsupportedEncodingException while processing XML", ue);
			return false;
		} catch (Exception ue) {
			android.util.Log.e(Utils.class.getSimpleName() + ":uploadResult", "Other Exception while processing XML", ue);
			return false;
		}
		
		android.util.Log.d(Utils.class.getSimpleName() + ":uploadResult", "PostRequestLine :" + postRequest.getRequestLine());
		
		HttpResponse response = null;
		BufferedReader in = null;
		try {
			response = httpClient.execute(postRequest);
			in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 4096);
			String line = "";
			while ((line = in.readLine) != null) {
				// do something?
				android.util.Log.d(Utils.class.getSimpleName() + ":uploadResult", line);
			}
			return true;
		} catch (Exception ex) {
			android.util.Log.e(Utils.class.getSimpleName() + ":uploadResult", "Exception while sending results", ex2);
			return false;
		} finally {
			httpClient.getConnectionManager().shutdown();
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {}
			}
		}
	}
 
So hab jetzt mal deinen Code ausprobiert, hab aber den teil mit der xml variable weggelassen weil ich nicht weiß was da rein soll.

Hier der neue Code:
Java:
private void getSourceCode() {
    	
    	HttpParams httpParameters = new BasicHttpParams();
    	HttpConnectionParams.setConnectionTimeout(httpParameters, 10000);
    	HttpConnectionParams.setSoTimeout(httpParameters, 15000);
    	 
    	HttpClient httpClient = new DefaultHttpClient(httpParameters);
    	HttpPost postRequest = new HttpPost("http://www.google.de");
    	HttpResponse response = null;
    	BufferedReader in = null;
    	try {
    		response = httpClient.execute(postRequest);
    		in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 4096);
    		String line = "";
    		while ((line = in.readLine()) != null) {
    			// do something?
    		}
    		return;
    	} catch (Exception ex) {
    		Log.e("ERROR", ex.getMessage());
    		return;
    	} finally {
    		httpClient.getConnectionManager().shutdown();
    		if (in != null) {
    			try {
    				in.close();
    			} catch (IOException e) {}
    		}
    	}
    	
    }

und hier was LogCat mir auswirft.

Anhang anzeigen 7113
 
NetworkingOnMainThreadException ist eigentlich selbstsprechend: Mache Netzwerkoperationen (Sockets oder UrlConnection oder eben Apache HttpClient / OkHttp) nicht auf dem Hauptthread.
Mach es in Services, AsyncTasks oder einfach eben anderen Threads.
 
Ach so, zu deiner Frage: Android forciert das mit dem Netzwerk, damit deine UI nicht blockiert. So haut dir die Umgebung gleich auf die Finger, wenn du etwas programmierst, dass das (evtl.) macht. Savvy?
 

Zurück
Oben