Exceptions beim Herstellen von FTP oder HTTP-Verbindung

  • Antworten:3
Enfreyer
  • Forum-Beiträge: 9

13.12.2012, 01:58:39 via Website

Hallo Community,
ich hab ein Problem, was mich nun nach mehr als 10 Stunden so langsam aber sicher in den absoluten Wahnsinn
treibt.

Meine Absicht: Das Ziel einer HTTP URL streamen und in einem String abspeichern.

Das Problem: Ich bekomme IMMER an der Stelle, an der letztlich die Verbindung aufgebaut wird, eine
IllegalStateException. Egal, ob ich es via HTTP oder FTP mache. Egal ob über die Apache.commons.net
oder über java.net. Egal, ob ich mir den Code selbst baue oder Beispielcodes aus dem Web suche (wovon
ich bereits mehr als fünf verschiedene getestet habe). Egal, welche URL ich benutze oder in welchem
Format ich sie übergebe.

Die Permission für die Internetverbindung ist gesetzt (auf meinem Tablet sehe ich es bei der Installation).
Die App schmiert sowohl im Emulator, als auch auf meinem Android 4.03 Tablet ab.

Der letzte Code, den ich benutzt habe, habe ich durch eure Forensuche gefunden (aus diesem Thread:
https://www.nextpit.de/de/android/forum/thread/456651/Load-Website-via-HttpURLConnection).

Eingebaut habe ich ihn mal folgendermaßen:

1public String button(View view) {
2
3 String websiteUrl = "h t t p:// www. android. com/"; // Die Leerzeichen sind nur hier im Forum, da ich hier keine externen Links benutzen darf
4 HttpURLConnection urlConnection = null;
5 try
6 {
7 final URL url = new URL(websiteUrl);
8 urlConnection = (HttpURLConnection) url.openConnection();
9 final InputStream result = new BufferedInputStream(urlConnection.getInputStream());
10 return readStream(result);
11
12 }
13 catch (MalformedURLException e)
14 {
15 Log.e("MY_TAG", e.getMessage());
16 }
17 catch (IOException e)
18 {
19 Log.e("MY_TAG", e.getMessage()); }
20 finally
21 {
22 if ( null != urlConnection )
23 {
24 urlConnection.disconnect();
25 }
26 }
27 return null;
28 }
29
30 private String readStream(final InputStream in) throws IOException
31 {
32 final BufferedReader reader = new BufferedReader(new InputStreamReader(in), 4096);
33 final StringBuilder result = new StringBuilder();
34
35 String line;
36 while ((line = reader.readLine()) != null)
37 {
38 result.append(line);
39 }
40 reader.close();
41 return result.toString();
42 }

Der Exception Trace (in der Logcat) sieht folgendermaßen aus:

112-13 00:32:07.663: E/AndroidRuntime(1630): FATAL EXCEPTION: main
212-13 00:32:07.663: E/AndroidRuntime(1630): java.lang.IllegalStateException: Could not execute method of the activity
312-13 00:32:07.663: E/AndroidRuntime(1630): at android.view.View$1.onClick(View.java:3044)
412-13 00:32:07.663: E/AndroidRuntime(1630): at android.view.View.performClick(View.java:3511)
512-13 00:32:07.663: E/AndroidRuntime(1630): at android.view.View$PerformClick.run(View.java:14105)
612-13 00:32:07.663: E/AndroidRuntime(1630): at android.os.Handler.handleCallback(Handler.java:605)
712-13 00:32:07.663: E/AndroidRuntime(1630): at android.os.Handler.dispatchMessage(Handler.java:92)
812-13 00:32:07.663: E/AndroidRuntime(1630): at android.os.Looper.loop(Looper.java:137)
912-13 00:32:07.663: E/AndroidRuntime(1630): at android.app.ActivityThread.main(ActivityThread.java:4424)
1012-13 00:32:07.663: E/AndroidRuntime(1630): at java.lang.reflect.Method.invokeNative(Native Method)
1112-13 00:32:07.663: E/AndroidRuntime(1630): at java.lang.reflect.Method.invoke(Method.java:511)
1212-13 00:32:07.663: E/AndroidRuntime(1630): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
1312-13 00:32:07.663: E/AndroidRuntime(1630): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
1412-13 00:32:07.663: E/AndroidRuntime(1630): at dalvik.system.NativeStart.main(Native Method)
1512-13 00:32:07.663: E/AndroidRuntime(1630): Caused by: java.lang.reflect.InvocationTargetException
1612-13 00:32:07.663: E/AndroidRuntime(1630): at java.lang.reflect.Method.invokeNative(Native Method)
1712-13 00:32:07.663: E/AndroidRuntime(1630): at java.lang.reflect.Method.invoke(Method.java:511)
1812-13 00:32:07.663: E/AndroidRuntime(1630): at android.view.View$1.onClick(View.java:3039)
1912-13 00:32:07.663: E/AndroidRuntime(1630): ... 11 more
2012-13 00:32:07.663: E/AndroidRuntime(1630): Caused by: android.os.NetworkOnMainThreadException
2112-13 00:32:07.663: E/AndroidRuntime(1630): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
2212-13 00:32:07.663: E/AndroidRuntime(1630): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
2312-13 00:32:07.663: E/AndroidRuntime(1630): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
2412-13 00:32:07.663: E/AndroidRuntime(1630): at java.net.InetAddress.getAllByName(InetAddress.java:220)
2512-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
2612-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
2712-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
2812-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
2912-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
3012-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
3112-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
3212-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
3312-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
3412-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
3512-13 00:32:07.663: E/AndroidRuntime(1630): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
3612-13 00:32:07.663: E/AndroidRuntime(1630): at com.example.httpcon.MainActivity.button(MainActivity.java:47)
3712-13 00:32:07.663: E/AndroidRuntime(1630): ... 14 more

Die genannte Zeile 47 ist im Code folgende:
1final InputStream result = new BufferedInputStream(urlConnection.getInputStream());

Verwendete Bibliotheken:
Android 4.2 (APK 17)
Android-support-v4 (auch im libs-ordner)
Apache.commons.net 3.2 (im Bsp. nicht benutzt)
Apache.commons.io 2.4 (im Bsp. nicht benutzt) (auch im libs-ordner)

Hat jemand eine Idee, was die Ursache für diesen Fehler ist?
Ich verzweifle so langsam...

VG, Enfreyer

— geändert am 13.12.2012, 02:05:09

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

13.12.2012, 08:15:13 via Website

Steht doch im StackTrace :)

112-13 00:32:07.663: E/AndroidRuntime(1630): Caused by: android.os.NetworkOnMainThreadException

Du führst Netzwerkverkehr auf dem UI Thread aus. Das ist seit neueren Android Versionen nicht mehr erlaubt und muss in z.B. einem AsyncTask erfolgen.

Antworten
Enfreyer
  • Forum-Beiträge: 9

13.12.2012, 10:32:55 via Website

Endlich mal eine klare Ansage, herzlichen Dank ^^.

Lese diese Info jetzt hier zum ersten mal, obwohl ich (nachdem ich es
selbst vergeblich versucht habe), viele Tutorials gelesen und mich durch
die API von Google geackert habe.

Werd mich da im Verlaufe des Tages mal reinarbeiten.
Danke nochmal.

VG,
Enfreyer.

Antworten
Stefan S.
  • Forum-Beiträge: 560

13.12.2012, 13:09:37 via Website

Ich empfehle dir auch den AsyncTask zu verwenden. Habe auch schon ein paar Programme bei mir anpassen müssen und die Verwendung dieses Tasks hat m.A. den geringsten Anpassungsaufwand.

Antworten