Probleme beim auslesen einer Webseite

  • Antworten:12
Tarkan G.
  • Forum-Beiträge: 5

27.08.2013, 21:12:53 via Website

Hallo,

ich bin neu hier und habe direkt mal eine Frage :). Ich habe angefangen ein Buch zu lesen für Einsteiger in die Android Programmierung. So weit fühle ich mich auch gut nur das Problem ist, dass ich irgendwie den Inhalt einer Webseite nicht aufrufen kann.

Unzwar habe ich eine Internetseite(die gehört u.a. mir): Kann wegen "spam" die Seite nicht schreiben
Nun möchte ich eine App machen und den Inhalt einer Nachricht in einer TextView (vorerst) haben.

Folgender Code:
1package com.trgol.trgol;
2
3import java.io.BufferedInputStream;
4import java.io.BufferedReader;
5import java.io.IOException;
6import java.io.InputStream;
7import java.io.InputStreamReader;
8import java.net.HttpURLConnection;
9import java.net.MalformedURLException;
10import java.net.URL;
11
12import android.app.Activity;
13import android.os.Bundle;
14import android.view.Menu;
15import android.widget.TextView;
16
17public class News extends Activity {
18
19
20
21 @Override
22 protected void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.news);
25
26 GetContentOfWebsite();
27
28 }
29
30 @Override
31 public boolean onCreateOptionsMenu(Menu menu) {
32 // Inflate the menu; this adds items to the action bar if it is present.
33 getMenuInflater().inflate(R.menu.news, menu);
34 return true;
35 }
36
37 private void GetContentOfWebsite()
38 {
39 TextView firstNews = (TextView)findViewById(R.id.firstNews);
40 HttpURLConnection urlConnection = null;
41
42 try
43 {
44 URL url = new URL(Die Webseite, da ich neu bin darf ich kein Link schreiben);
45 urlConnection = (HttpURLConnection)url.openConnection();
46 InputStream in = new BufferedInputStream(urlConnection.getInputStream());
47 ReadStream(in,firstNews);
48 }
49
50 catch(MalformedURLException e)
51 {
52 e.printStackTrace();
53 }
54
55 catch(IOException e)
56 {
57 e.printStackTrace();
58 }
59
60 finally
61 {
62 if(null!=urlConnection)
63 {
64 urlConnection.disconnect();
65 }
66 }
67
68 }
69
70 private void ReadStream(InputStream in, TextView textView) throws IOException
71 {
72 BufferedReader rd = new BufferedReader(new InputStreamReader(in), 4096);
73 String line;
74 StringBuilder sb = new StringBuilder();
75 while ((line = rd.readLine()) != null)
76 {
77 sb.append(line);
78 }
79 rd.close();
80
81 textView.setText(sb.toString());
82 }
83
84}

Logcat spuckt mir folgendes aus:
108-27 21:10:28.719: E/AndroidRuntime(24792): FATAL EXCEPTION: main
208-27 21:10:28.719: E/AndroidRuntime(24792): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.trgol.trgol/com.trgol.trgol.News}: android.os.NetworkOnMainThreadException
308-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
408-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
508-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.ActivityThread.access$700(ActivityThread.java:140)
608-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
708-27 21:10:28.719: E/AndroidRuntime(24792): at android.os.Handler.dispatchMessage(Handler.java:99)
808-27 21:10:28.719: E/AndroidRuntime(24792): at android.os.Looper.loop(Looper.java:137)
908-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.ActivityThread.main(ActivityThread.java:4921)
1008-27 21:10:28.719: E/AndroidRuntime(24792): at java.lang.reflect.Method.invokeNative(Native Method)
1108-27 21:10:28.719: E/AndroidRuntime(24792): at java.lang.reflect.Method.invoke(Method.java:511)
1208-27 21:10:28.719: E/AndroidRuntime(24792): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
1308-27 21:10:28.719: E/AndroidRuntime(24792): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
1408-27 21:10:28.719: E/AndroidRuntime(24792): at dalvik.system.NativeStart.main(Native Method)
1508-27 21:10:28.719: E/AndroidRuntime(24792): Caused by: android.os.NetworkOnMainThreadException
1608-27 21:10:28.719: E/AndroidRuntime(24792): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
1708-27 21:10:28.719: E/AndroidRuntime(24792): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
1808-27 21:10:28.719: E/AndroidRuntime(24792): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
1908-27 21:10:28.719: E/AndroidRuntime(24792): at java.net.InetAddress.getAllByName(InetAddress.java:214)
2008-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
2108-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
2208-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
2308-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
2408-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
2508-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
2608-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
2708-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
2808-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
2908-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
3008-27 21:10:28.719: E/AndroidRuntime(24792): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
3108-27 21:10:28.719: E/AndroidRuntime(24792): at com.trgol.trgol.News.GetContentOfWebsite(News.java:46)
3208-27 21:10:28.719: E/AndroidRuntime(24792): at com.trgol.trgol.News.onCreate(News.java:26)
3308-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.Activity.performCreate(Activity.java:5206)
3408-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
3508-27 21:10:28.719: E/AndroidRuntime(24792): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
3608-27 21:10:28.719: E/AndroidRuntime(24792): ... 11 more


Könnt ihr mir irgendwie weiterhelfen.


Ich bedanke mich im Voraus :).

— geändert am 27.08.2013, 21:14:51

Antworten
Michele
  • Forum-Beiträge: 1.525

27.08.2013, 21:19:25 via Website

Hallo.

Setze das mal in die AsyncTask rein.

Das was im Hintergrund passiert, also die Webseite laden oder sonstiges
kommt in doInBackground() rein.

Was du dann zeigen willst, kommt in onPostExecute(); rein.
Also dein TextView.

http://developer.android.com/reference/android/os/AsyncTask.html


LG

Antworten
Tarkan G.
  • Forum-Beiträge: 5

27.08.2013, 21:52:09 via Website

Mit dem kenne ich mich zwar überhaupt nicht aus (höre ich zum ersten mal).
Die App funktioniert zwar ohne Fehler ausgabe, jedoch habe ich kein Text :D.

Aber ich kopier mal mein Code hier rein:

1package com.trgol.trgol;
2
3import java.io.BufferedInputStream;
4import java.io.BufferedReader;
5import java.io.IOException;
6import java.io.InputStream;
7import java.io.InputStreamReader;
8import java.net.HttpURLConnection;
9import java.net.MalformedURLException;
10import java.net.URL;
11
12import android.app.Activity;
13import android.os.AsyncTask;
14import android.os.Bundle;
15import android.widget.TextView;
16
17public class News extends Activity {
18
19
20 TextView firstNews = null;
21 @Override
22 protected void onCreate(Bundle savedInstanceState) {
23 super.onCreate(savedInstanceState);
24 setContentView(R.layout.news);
25
26 LoadWebsiteAsync load = new LoadWebsiteAsync();
27 load.execute();
28
29 }
30
31 class LoadWebsiteAsync extends AsyncTask<String, Void, String>
32 {
33 HttpURLConnection urlConnection = null;
34 InputStream in = null;
35
36 @Override
37 protected String doInBackground(String... urls)
38 {
39 try
40 {
41 URL url = new URL("internetseite");
42 urlConnection = (HttpURLConnection)url.openConnection();
43 in = new BufferedInputStream(urlConnection.getInputStream());
44
45 }
46
47 catch(MalformedURLException e)
48 {
49 e.printStackTrace();
50 }
51
52 catch(IOException e)
53 {
54 e.printStackTrace();
55 }
56
57 finally
58 {
59 if(null!=urlConnection)
60 {
61 urlConnection.disconnect();
62 }
63 }
64 return null;
65 }
66
67 @Override
68 protected void onPostExecute(String result)
69 {
70 firstNews = (TextView)findViewById(R.id.firstNews);
71 try
72 {
73 ReadStream(in,firstNews);
74 }
75 catch (IOException e)
76 {
77 e.printStackTrace();
78 }
79 }
80 }
81
82 private void ReadStream(InputStream in, TextView textView) throws IOException
83 {
84 BufferedReader rd = new BufferedReader(new InputStreamReader(in), 4096);
85 String line;
86 StringBuilder sb = new StringBuilder();
87 while ((line = rd.readLine()) != null)
88 {
89 sb.append(line);
90 }
91 rd.close();
92
93 textView.setText(sb.toString());
94 }
95}

Antworten
Felice M.
  • Forum-Beiträge: 53

27.08.2013, 22:01:04 via Website

ka, ob es daran liegt, aber mit 'nem bissl Glück ;)

Du legst die Variable "firstNews" in Zeile 70 ein und versuchst in Zeile 93 auf die Variable "textView" zuzugreifen. müsste es nicht heißen: "firstNews.setText(sb.toString());" ?

Antworten
Michele
  • Forum-Beiträge: 1.525

27.08.2013, 22:09:18 via Website

Ab API 11 brauchst du AsyncTask für sowas.
Oder API keine ahnung. Welches weiß ich auch nicht mehr.

Kommt natürlich drauf an welches API Level du nutzt.
Und hast du auch die permissions festgelegt in der Manifest?

Und du bist also nur einen einfachen Text von einer Website lesen ja?
Finde das geht viel einfacher als wie du es schreibst.



LG

— geändert am 27.08.2013, 22:12:18

Antworten
Tarkan G.
  • Forum-Beiträge: 5

27.08.2013, 22:14:31 via Website

@Felice
Danke für deine Hilfe, aber es ist richtig so, weil ja ReadStream eine Methode ist und Textview ein Parameter. In Zeile 47 übergebe ich ja firstNews. Trotzdem danke :)

@Michele
Benutze API 17 und die permissions habe ich auch schon gemacht.
Ist denn der Code soweit richtig??

Was heißt einfacher?

— geändert am 27.08.2013, 22:15:22

Antworten
Michele
  • Forum-Beiträge: 1.525

27.08.2013, 22:25:50 via Website

Warum benutzt du eine extra Methode?


LG

Antworten
Christian
  • Forum-Beiträge: 307

27.08.2013, 22:32:05 via Website

Hi Tarkan,

wird einer der Exceptions im AsynTask geworfen?
Hast mal geschaut ob die while Schleife auch durch laufen wird?

@Michele:
Warum benutzt du eine extra Methode?
?
Welchen Weg würdest du denn wählen um eine Text von na Website zu laden?

mfg Christian

Antworten
Michele
  • Forum-Beiträge: 1.525

27.08.2013, 22:37:45 via Website

Bestimmt nicht so kompliziert :D

Ich lade zwar kein Text von einer Website aber von meinem Server aus der Textdatei.

Und ist "fast" das gleiche finde ich.

Und bei mir klappt es.
Ich kann es ja posten hier. Aber lernen tut er so nichts.:D

1public class MainActivity extends Activity {
2
3 public String inputLine;
4 public StringBuilder text;
5 public BufferedReader in;
6 public URL url;
7 public TextView textView;
8
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 setContentView(R.layout.activity_main);
13
14 textView = (TextView) findViewById(R.id.textView);
15
16 new DownloadTask().execute();
17
18 }
19
20 public class DownloadTask extends AsyncTask<String, Void, String> {
21
22 @Override
23 protected String doInBackground(String... arg0) {
24
25 try {
26 url = new URL("DEIN LINK");
27 in = new BufferedReader(new InputStreamReader(url.openStream()));
28 inputLine = null;
29 text = new StringBuilder();
30 while ((inputLine = in.readLine()) != null) {
31 text.append(inputLine);
32 text.append('\n');
33 }
34 in.close();
35 } catch (MalformedURLException e) {
36 e.printStackTrace();
37 } catch (IOException e) {
38 e.printStackTrace();
39 }
40 return null;
41 }
42
43 @Override
44 protected void onPostExecute(String result) {
45
46 textView.setText(text);
47
48 }
49 }
50}

Bisschen sauberer und einfacher oder?
Nun musste noch hier und da bisschen was machen damit er deine Website lädt.


LG

— geändert am 27.08.2013, 22:40:48

Tarkan G.

Antworten
Tarkan G.
  • Forum-Beiträge: 5

27.08.2013, 22:41:17 via Website

@Christian
Hi :)
Leider keine exceptions. Die App startet aber ich sehe kein text.

@Michele
Ich werde mir das mal angucken und versuchen auf meines zu übertragen.

Antworten
Christian
  • Forum-Beiträge: 307

27.08.2013, 22:50:39 via Website

@Michele:
Ach so du meintest mit extra Methode, dass Tarkan das auslesen des Inputstream in die Methode ReadStream ausgelagert hat.
Da hatte ich irgenwie ein Brett vorm Kopf :D

@Tarkan:
Ich vermutet mal die while-Schleife wird nicht durchlaufen. Es müsste eigentlich daran liegen das du die Verbindung schließt bevor du den InputStream ausliest.

Aber die Lösung von Michele sollte jetzt eigentlich dein Problem lösen.

Mfg Christian

— geändert am 27.08.2013, 22:51:35

Antworten
Tarkan G.
  • Forum-Beiträge: 5

27.08.2013, 23:03:04 via Website

Danke euch !!!! Habs geschafft :D

Special Thanks to Michele :)

Antworten
Michele
  • Forum-Beiträge: 1.525

27.08.2013, 23:16:17 via Website

@Christian:

Was für eine Methode dachtest du denn? :D:grin:

@Tarkan:

Freut mich. Nächstes mal bisschen selbst erforschen.
Keiner wird dir hier eigentlich ein kompletten Code geben.


LG

Antworten