Text aus txt von Server auslesen und ausgeben

Feelix333

Feelix333

Stammgast
315
Hallo zusammen,

Wie der Titel schon sagt, möchte ich einen einfachen Text aus einer txt-Datei, die auf einem Server liegt auslesen und wiedergeben.

Ich habe jetzt schon viele Ansätze probiert, aber komme einfach nicht weiter - oft widersprechen sich Aussagen in stackoverflow auch..

Ich habe vom Layout her einen einfachen Button und einen TextView, beim klick auf den Button soll der Text ausgelesen werden und in der TextView angezeigt werden.

Variante 1
Code:
public void onClick(View v) {
		if (button1 == v)
		{ try {
				URL url = new URL("http://xxxxx.de/txt/test.txt");
	            HttpURLConnection.setFollowRedirects(true);
	            HttpURLConnection con = (HttpURLConnection) url.openConnection();
	            con.setDoOutput(false);
	            con.setReadTimeout(20000);
	            con.setRequestProperty("Connection", "keep-alive");

	            con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 

Firefox/16.0");
	            ((HttpURLConnection) con).setRequestMethod("GET");
	            //System.out.println(con.getContentLength()) ;
	            con.setConnectTimeout(5000);
	            BufferedInputStream in = new BufferedInputStream(con.getInputStream());
	            int responseCode = con.getResponseCode();
	            if (responseCode == HttpURLConnection.HTTP_OK) {
	                System.out.println(responseCode);
	            }
	            StringBuffer buffer = new StringBuffer();
	            int chars_read;
	            //int total = 0;
	            while ((chars_read = in.read()) != -1) 
	            {
	                char g = (char) chars_read;
	                buffer.append(g);
	            }
	            final String page = buffer.toString();
	            
	            TextView ausgabe = (TextView)findViewById(R.id.ausgabe);
				ausgabe.setText(page);
				}
				catch (Exception exception)
				{
					//NULL
				}
}

Variante 2
Code:
public void onClick(View v) {
		if (button1 == v)
		{
try {
			    // Create a URL for the desired page
			    URL url = new URL("xxxxx.de/txt/test.txt");

			    // Read all the text returned by the server
			    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
			    String text;
			    while ((text = in.readLine()) != null)
			    {
			    	TextView ausgabe = (TextView)findViewById(R.id.ausgabe);
					ausgabe.setText(text);
			    	// str is one line of text; readLine() strips the newline character(s)
			    }
			    in.close();
			} catch (MalformedURLException e) {
			} catch (IOException e) {
			}
}

Variante 3
Code:
public void onClick(View v) {
		if (button1 == v)
		{
HttpGet httppost = new HttpGet("http://xxxxx.de/txt/test.txt");
					HttpResponse response = httpclient.execute(httppost);
			       	HttpEntity ht = response.getEntity();

			        BufferedHttpEntity buf = new BufferedHttpEntity(ht);

			        InputStream is = buf.getContent();


			        BufferedReader r = new BufferedReader(new InputStreamReader(is));

			        StringBuilder total = new StringBuilder();
			        String line;
			        while ((line = r.readLine()) != null) {
			            total.append(line + "\n");
			        }

			        TextView ausgabe = (TextView)findViewById(R.id.ausgabe);
					ausgabe.setText(total);
}

Das ganze kann doch nicht so schwer sein?!
Bitte helft mir, bin langsam echt frustriert -.-

mfg
Felix
 
ich sehe in keinem deiner code ausschnitte, dass der code in einem thread ausgeführt wird.
das lässt android dann nicht zu.

es ist sicher nicht so schwer. welchen fehler bekommst denn ? wo ist das problem konkret?
 
  • Danke
Reaktionen: Feelix333
Du kriegst einen Fehler angezeigt, vermutlich sogar dreimal den gleichen ... Lies die Fehlermeldung, google die Fehlermeldung.

Und wie swordi bereits vermutet, tippe auch ich auf das gleiche Problem. Deine Fehlermeldung die du im Logcat erhältst wird vmtl. "android.os.NetworkOnMainThreadException" sein oder? ;)

Nimm die Bestandteile der Bezeichnung auseinander "Network" "on" Main" "Thread". Wenn das nicht hilft, googlen ...

Why Ice Cream Sandwich Crashes your App | Android Design Patterns
(Dort steht auch, dass sich das zwischen Android 2.x und 4.x geändert hat ... und aus diesem Grund wirst du auch alte "fehlerhafte" Anleitungen gefunden haben)
 
  • Danke
Reaktionen: Feelix333
Hallo zusammen,

Ja, den "NetworkOnMainThreadException" - Fehler habe ich tatsächlich oft bekommen.
Aber das kann es doch nichts sein, dass ich das nicht ausführen kann?!
Ich habe noch nie mit mehreren Threads gearbeitet, bin leider noch nicht so fortgeschritten..

EDIT: Wenn ich minsdkversion und targetsdkversion auf 9 setze funktioniert es einwandfrei.
Obwohl ich auf meinem Nexus 5 mit 4.4.3 debugge.

Hat das herunterstellen (vorher 14 & 19) keine negativen Auswirkungen auf Geräte mit höherer Version?

mfg
Felix
 
Zuletzt bearbeitet:
Liest dir einfach das hier durch:
AsyncTask | Android Developers
Processes and Threads | Android Developers

Da wird es erklärt und wenn du bisher nicht mit Threads gearbeitet hast, dann fang jetzt damit an und lerne es ;)

Und doch das kann sein, dass du das nicht ausführen kannst.
Theoretisch wäre das was du machst möglich, aber Google hats quasi verboten.
Aus gutem Grund, weil nämlich viel zu viele Menschen es gemacht haben wie du.
Das Problem ist:
Überleg mal was passiert, wenn deine HTTP Abfrage länger dauert, weil die Datei besonders groß ist oder aber das Netzwerk besonders langsam (oder beides)
In deinem ersten Beispiel hast du einen Timeout von 20.000ms
Das heißt im zweifel bleibt deine ganze App für 20 Sekunden einfach stehen, du kannst weder scrollen, noch buttons drücken die friert einfach ein.
Und genau das soll nicht passieren.
Die Oberfläche deiner App ist das, was der User sieht und mit das wichtigste eines jeden Programms.
Der normale User sieht nämlich nur die Oberfläche, da reichen schon kleine Fehler um den User denken zu lassen "Was für eine Kack-App", Dinge die im Hintergrund passieren sind weniger tragisch, solange sie nicht die komplette App abstürzen lassen.

Also tu dir selbst einen gefallen schau dir die Doku an und lerne.
 
  • Danke
Reaktionen: Feelix333
FelixF schrieb:
EDIT: Wenn ich minsdkversion und targetsdkversion auf 9 setze funktioniert es einwandfrei.
Natürlich funktioniert es dann. Hier: NetworkOnMainThreadException | Android Developers steht ja, dass die Exception ab API Level 11 (Honeycomb) geworfen wird, weil Netzwerkoperationen nicht im Main Thread ausgeführt werden dürfen. Bis einschließlich Android Gingerbread durfte man das halt noch. Aber da wie amfa schon erklärt hat durch Zeitüberschreitung die App einfrieren kann (ANR), wurde das halt (Gott sei dank) geändert. Und klar funktioniert es dann auf deinem N5 auch, weil TargetSDK ja Gingerbread ist - sinnvoll ist das aber nicht wirklich, sowas zu machen.
 
  • Danke
Reaktionen: Feelix333
Hallo,

Beim dem Text im meiner text.txt handelt es sich aber nur um 1 Wort - deshalb geht es auch reibungslos und friert nicht ein - egal wie langsam die Internetverbindung ist.
Außerdem gebe ich beim start einen "Please Wait" und nach Beendigung einen "Finished" - Toast aus.

Wenn ich es also auf targetsdkversion 9 (bis 11) lasse, kann die App ganz normal von allen verwendet werden?

Werde mich mal bisschen in AsyncTask einlesen - hat dazu noch jemand Tipps? ;)


Danke.

mfg
Felix
 
FelixF schrieb:
deshalb geht es auch reibungslos und friert nicht ein - egal wie langsam die Internetverbindung ist.
Das nenn ich mal Selbstbewusstsein :lol: (nur leider unangebracht). Wenn die Antwortzeiten im Netzwerk so lange sind, dass bereits die Anfrage in ein Timeout läuft oder Pakete auf dem Weg verloren gehen, dann friert es doch wieder ein ...
 
google hatte gute gründe, warum sie das nicht im main thread zulassen. es gibt leider zu viele entwickler, die sich nicht um sowas kümmern und die glauben überall hat man ne perfekte verbindung und es kann nichts schief gehen.

die häufigkeit der schlechten apps wäre noch höher, wenn google das nicht blockiert hätte.


so schwer ist es jetzt aber wirklich nicht. ne klasse schreiben, die von asynctask abgeleitet ist und fertig. aufwand < 2 minuten. dafür gibts 100000 beispiele im netz.
 
  • Danke
Reaktionen: Feelix333
swordi schrieb:
so schwer ist es jetzt aber wirklich nicht. ne klasse schreiben, die von asynctask abgeleitet ist und fertig. aufwand < 2 minuten. dafür gibts 100000 beispiele im netz.

Einfach für einen Profi wie dich, klar ;)
Aber ich sehs ein - werds mal probieren und mich bei Fragen wieder melden^^
Danke.

mfg
Felix
 
Zitat:
Zitat von swordi
so schwer ist es jetzt aber wirklich nicht. ne klasse schreiben, die von asynctask abgeleitet ist und fertig. aufwand < 2 minuten. dafür gibts 100000 beispiele im netz.

Einfach für einen Profi wie dich, klar ;)
Aber ich sehs ein - werds mal probieren und mich bei Fragen wieder melden^^
Danke.

mfg
Felix

Wenn das ein Problem für dich dar stellt, solltest du vllt erstmal Java Grundlagen lernen und dich erst in ein paar Monaten dich mit Android beschäftigen ;)

lg.
 

Ähnliche Themen

H
Antworten
2
Aufrufe
1.309
Hcman
H
Muecke1982
Antworten
8
Aufrufe
1.034
Skyhigh
Skyhigh
Jansenwilson
Antworten
1
Aufrufe
755
swa00
swa00
Zurück
Oben Unten