Website quellcode mit "Stream" auslesen??

  • Antworten:19
Andreas B.
  • Forum-Beiträge: 23

08.02.2014, 16:09:38 via Website

Hallo zusammen

Ich möchte den Quellcode einer Website auslesen. Jetzt ist dieser sehr lang so ca. 350'000 Zeichen.

Ich lese den Code so aus:

1client = new DefaultHttpClient();
2 request = new HttpGet(website);
3
4 responseHandler = new BasicResponseHandler();
5
6 try {
7 response_str = client.execute(new HttpGet(websiteURL), new BasicResponseHandler());
8
9 } catch (ClientProtocolException e) {
10 e.printStackTrace();
11 } catch (IOException e) {
12 e.printStackTrace();
13 }
Doch natürlich kann ein einziger String keine 350000 Zeichen Speichern. :grin:
Man hat mir gesagt ich solle aus dem response der "execute" mit "getEntity" das HTTPEntity holen und dann von dem Objekt den "InputStream" mit "getContent". Und diesen dann mit diesem wie mit jedem Stream arbeiten.

1. wo muss ich "getEntity" und "getContent" hinschreiben?
2. Was ist mit "dem Objekt" gemeint?
und 3. mit Google fand ich nur Ergebnisse wie man einen Film oder eine Audiodatei "streamt" aber nicht wie einen Quellcode. :(


Danke euch
Andreas B.

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

08.02.2014, 16:25:25 via Website

Andreas B.
Hallo zusammen


Doch natürlich kann ein einziger String keine 350000 Zeichen Speichern. :grin:

Danke euch
Andreas B.

Warum sollte ein String keine 350000 Zeichen halten können? Wo steht das?

Strings limitieren sich lediglich durch den verfügbaren Speicher .. respektive durch die maximal darstellbare Zahl Integer.MAX_VALUE ( 2147483647) ..
Das sind die "hard limits".

Btw. würde ich StringBuffer verwenden... ist um Hausecken schneller ..

— geändert am 08.02.2014, 16:26:36

lg Voss

Antworten
Andreas B.
  • Forum-Beiträge: 23

08.02.2014, 18:05:49 via Website

Jörg V.

Warum sollte ein String keine 350000 Zeichen halten können? Wo steht das?

Strings limitieren sich lediglich durch den verfügbaren Speicher .. respektive durch die maximal darstellbare Zahl Integer.MAX_VALUE ( 2147483647) ..
Das sind die "hard limits".

Btw. würde ich StringBuffer verwenden... ist um Hausecken schneller ..

Und warum dann zeigt es bei quellcode.leght(); nur ca. 35000 aus???
Aber System.out.println(); kann sicher keine 350000 zeichen ausgeben (jeden falls bei mir) sondern nur ein Bruchteil des Codes.

Antworten
impjor
  • Forum-Beiträge: 1.793

08.02.2014, 18:16:05 via App

String#length() liefert dir die Länge des Strings. System.out.println() schreibt das ganze in das LogCat... Was hat das miteinander/mit deinem Problem zu tun?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Andreas B.
  • Forum-Beiträge: 23

08.02.2014, 18:23:59 via Website

Bei beiden Varianten gibt es nicht den ganzen Quellcode aus bzw. ganze Länge.
Mir ist noch in den Sinn gekommen: kann es daran liegen dass ich eine VM benutze?? Teste das ganze mal auf dem Handy aus.

Antworten
impjor
  • Forum-Beiträge: 1.793

08.02.2014, 20:23:30 via Website

Andreas B.
Bei beiden Varianten gibt es nicht den ganzen Quellcode aus bzw. ganze Länge.
Welche Varianten?
1try {
2response_str = client.execute(new HttpGet(websiteURL), new BasicResponseHandler());
3 }

Es gibt aber selbst hier im Forum viele Tutorials zum Download einer Webseite (z.B. hier).

Wichtig ist nur, dass die ganze Geschichte im AsyncTask oder anderem Thread läuft, da deine App sonst auf Android 3.0+ abstürzt.

LG

— geändert am 08.02.2014, 20:53:35

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Andreas B.
  • Forum-Beiträge: 23

08.02.2014, 20:28:06 via Website

Egal wie ich es drehe und wende: Es gibt immer zu wenig Code bzw. eine zu kleine Zeichen Anzahl aus. Was mache ich falsch??? :(

EDIT: Ok danke ich schau mir das mal an. Und ich starte es in einem 2. Thread. Es gibt keine Error Meldung.

— geändert am 08.02.2014, 20:31:02

Antworten
impjor
  • Forum-Beiträge: 1.793

08.02.2014, 20:30:11 via Website

Andreas B.
Egal wie ich es drehe und wende: Es gibt immer zu wenig Code bzw. eine zu kleine Zeichen Anzahl aus. Was mache ich falsch??? :(
Wie gesagt, es wäre interessant, was du überhaupt machst...>_>>_> Der obige Code ist doch nicht alles?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Andreas B.
  • Forum-Beiträge: 23

08.02.2014, 20:44:23 via Website

Hier den ganzen Code: PS: musste die Links aus Google Bildersuche im Code entfernen da ich als relativ neues Mitglied noch keine Links veröffentlichen kann...
1public void onCreate(Bundle savedInstanceState) {
2 super.onCreate(savedInstanceState);
3 setContentView(R.layout.rechner_activity);
4 showResult = (EditText)findViewById(R.id.result_id);
5
6 }
7public void browser(){
8
9 setContentView(R.layout.browser_main);
10
11
12 urlEditText = (EditText) findViewById(R.id.urlField);
13 urlEditText.setText("");
14 webView = (WebView) findViewById(R.id.webView);
15 webView.setWebViewClient(new WebViewClient());
16 Button openUrl = (Button) findViewById(R.id.goButton);
17 openUrl.setOnClickListener(new OnClickListener() {
18 @Override
19 public void onClick(View view) {
20 url = urlEditText.getText().toString();
21 website = "LINK AUF GOOGLE BILDERSUCHE q="+url;
22 webView.getSettings().setJavaScriptEnabled(true);
23 webView.loadUrl("LINK AUF GOOGLE BILDERSUCHE q="+url);
24
25 Thread codeThread = new Thread(new quellcode());
26 codeThread.start();
27
28 for(;!fertig;){
29 try {
30 Thread.sleep(100);
31 } catch (InterruptedException e) {
32
33 e.printStackTrace();
34 }
35 if(fertig){
36 urlEditText.setText(""+response_str);
37 }
38 }
39
40 }
41
42
43 });
44
45 }
46public class quellcode implements Runnable{
47
48 public void start(){
49
50
51 }
52
53 public void run(){
54
55 responseHandler = new BasicResponseHandler();
56
57 try {
58 response_str = ""+client.execute(new HttpGet(website), new BasicResponseHandler()).length();
59
60 fertig = true;
61
62 } catch (ClientProtocolException e) {
63 e.printStackTrace();
64 } catch (IOException e) {
65 e.printStackTrace();
66 }
67
68 }
69
70 }

Ich hoffe, dass der Code nicht zu unordentlich ist...

EDIT: Na toll alle Taulatoren weg... ://

— geändert am 08.02.2014, 20:45:32

Antworten
impjor
  • Forum-Beiträge: 1.793

08.02.2014, 20:50:52 via Website

1Thread codeThread = new Thread(new quellcode());
2 codeThread.start();
3 for(;!fertig;){
4 try {
5 Thread.sleep(100);
6 } catch (InterruptedException e) {...}
7 if(fertig){
8 urlEditText.setText(""+response_str);
9 }
:wink::wink:
Du startest einen neuen Thread, der die Webseite downloaded und wartest dann im Ui-Thread auf das Ende des Quellcode-Threades(). Dann hättest du ja auch gleich das Downloaden im Ui-Thread durchführen können. Bitte lösche alles hinter codeThread.start(); dieser Funktion! Du musst den Text des urlEditText am Ende des Quellcode-Threades setzen.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Andreas B.
  • Forum-Beiträge: 23

08.02.2014, 21:00:56 via Website

Also alles im Ui-Thread kann man am 3.0 nicht mehr... Aber du hast recht is sehr hässlich geschrieben. Ich werds bereinigen. Und dank deinem Tut-link bin ich schon wieder ein Schritt weiter. Thx

Antworten
impjor
  • Forum-Beiträge: 1.793

08.02.2014, 21:27:07 via Website

Ja, aber warum kann man ab 3.0+ nicht mehr alles im Ui-Thread machen?
Weil ein Download eben auch mal etwas länger benötigen kann (vor allem im Mobilfunk) und dabei das komplette UserInterface blockiert (keine Buttons gehen mehr, keine Änderungen werden sichtbar...) und nach 5 Sekunden kommt eine ANR-Meldung(App Not Responding = App antwortet nicht mehr), die den User auffordert die App zu beenden oder zu warten.
Deine "Lösung" ist aber nicht besser (außer dass sie eben keine Exception auf Android 3.0+ wirft), eine ANR wird aber trotzdem auftreten...
LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.02.2014, 22:21:51 via App

Du brauchst eine Callback methode die Aufgerufen wird wenn der Thread seine Arbeit beendet hat. Dann kannst du weiter verfahren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Andreas B.
  • Forum-Beiträge: 23

09.02.2014, 11:43:16 via Website

Noch etwas: zurzeit liest es den Code an einem Stück ohne Zeilenumbrüche aus. Gibt es eine Möglichkeit diese mit zu downloaden?

LG Andreas

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 11:45:51 via Website

Diese werden mitgedownloaded, wenn sie auch auf dem Server gespeichert sind. System.out.println() ist aber keine geeignete Methode um dies zu überprüfen.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Andreas B.
  • Forum-Beiträge: 23

09.02.2014, 11:53:00 via Website

Ich habe es mit
1HttpResponse response = client.execute(request);
2 InputStream in = response.getEntity().getContent();
3 BufferedReader reader = new BufferedReader(new InputStreamReader(in));
4 int oft = 0;
5 String tmp;
6 while ((tmp = reader.readLine()) != null) {
7 source += tmp;
8 oft++;
9 }
10 System.out.println(""+oft);
geprüft. --> oft = 1
Das heisst es gibt nur eine Linie... Und auch in einer Text View gibt es keine Zeilenumbrüche...

Antworten
Andreas B.
  • Forum-Beiträge: 23

09.02.2014, 13:12:23 via Website

Aber wieso zeigt es dann bei "Quelltext anzeigen" auf dem pc die zeilenumbrüche?:blink:

LG

Antworten
Andreas B.
  • Forum-Beiträge: 23

09.02.2014, 13:31:06 via Website

Es hat beides...

Antworten