HttpUrlConnection stürzt ab

P

Piwo72

Neues Mitglied
0
Hallo zusammen,
ich möchte in meiner App lediglich eine URL aufrufen (es sollen nur via GET-variablen Daten an eine dort liegende php-datei angegeben werden, welche dann in eine MySQL-tabelle eingetragen werden).
Das Problem ist jedoch meine App stürzt dabei immer ab... Habe es auch schon mit den Klassen HtpClient/HttpPost versucht, alles jedoch mit dem gleichen Resultat...
Mein Code jetzt:
PHP:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		try {
			URL url = new URL("http://example.de?var1=...");
		    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
		    urlConnection.connect();
		} catch (IOException e) {
			Log.e("Exception:", e.getMessage());
		}

Auszug aus der Logcat:

04-26 16:32:38.985: E/Trace(25994): error opening trace file: No such file or directory (2)
04-26 16:32:39.195: W/dalvikvm(25994): threadid=1: thread exiting with uncaught exception (group=0x41055540)
04-26 16:32:39.195: E/AndroidRuntime(25994): FATAL EXCEPTION: main
04-26 16:32:39.195: E/AndroidRuntime(25994): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.example.instmsg/de.example.instmsg.MainActivity}: android.os.NetworkOnMainThreadException
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2355)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.ActivityThread.access$600(ActivityThread.java:151)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.os.Handler.dispatchMessage(Handler.java:99)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.os.Looper.loop(Looper.java:155)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.ActivityThread.main(ActivityThread.java:5520)
04-26 16:32:39.195: E/AndroidRuntime(25994): at java.lang.reflect.Method.invokeNative(Native Method)
04-26 16:32:39.195: E/AndroidRuntime(25994): at java.lang.reflect.Method.invoke(Method.java:511)
04-26 16:32:39.195: E/AndroidRuntime(25994): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
04-26 16:32:39.195: E/AndroidRuntime(25994): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
04-26 16:32:39.195: E/AndroidRuntime(25994): at dalvik.system.NativeStart.main(Native Method)
04-26 16:32:39.195: E/AndroidRuntime(25994): Caused by: android.os.NetworkOnMainThreadException
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1208)
04-26 16:32:39.195: E/AndroidRuntime(25994): at java.net.InetAddress.lookupHostByName(InetAddress.java:388)
04-26 16:32:39.195: E/AndroidRuntime(25994): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:239)
04-26 16:32:39.195: E/AndroidRuntime(25994): at java.net.InetAddress.getAllByName(InetAddress.java:214)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
04-26 16:32:39.195: E/AndroidRuntime(25994): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
04-26 16:32:39.195: E/AndroidRuntime(25994): at de.example.instmsg.MainActivity.onCreate(MainActivity.java:34)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.Activity.performCreate(Activity.java:5066)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
04-26 16:32:39.195: E/AndroidRuntime(25994): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
04-26 16:32:39.195: E/AndroidRuntime(25994): ... 11 more
04-26 16:32:40.595: D/Process(25994): killProcess, pid=25994
04-26 16:32:40.595: D/Process(25994): dalvik.system.VMStack.getThreadStackTrace(Native Method)
04-26 16:32:40.595: D/Process(25994): java.lang.Thread.getStackTrace(Thread.java:599)
04-26 16:32:40.595: D/Process(25994): android.os.Process.killProcess(Process.java:956)
04-26 16:32:40.595: D/Process(25994): com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:108)
04-26 16:32:40.595: D/Process(25994): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
04-26 16:32:40.595: D/Process(25994): java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
04-26 16:32:40.595: D/Process(25994): dalvik.system.NativeStart.main(Native Method)

Habe mir aus einigen Tutorials mehrere Beispielcodes rüberkopiert, kam jedoch immer ein Absturz mit ähnlicher/gleicher Logcat...

Hoffe jemand kann mir helfen mein Problem zu lösen und zu helfen eine einfache Verbindung zur gegebenen URL zu etablieren...

Danke im vorraus :)

P.S. Im Manifest wurde natürlich die INTERNET-permission hinzugefügt
 
"Caused by: android.os.NetworkOnMainThreadException"

Keine Netzwerkoperationen im Mainthread (= GUI). AsyncTask ist das Stichwort ...
 
einfach mal die fehlermeldung bei google reinkopieren hilft mit sicherheit
 
Danke für die Hilfe soweit, habe gegoogelt und neben der Lösung mit AsyncTask noch eine andere Möglichkeit gefunden, nämlich vorher diesen Code einzufügen:
PHP:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

Wollte nun fragen ob die Network-operation im Mainthread irgendwelche Nachteile mit sich führt und allgemein welche der beiden Methoden sinnvoller wäre.
 
Deine GUI wird solange Netzwerkoperationen auf dem selben Thread ausgeführt werden blockiert. Dauert die Netzwerkoperation mal etwas länger, könnten deine Appnutzer einen ForceClose erhalten.
 
Faszinierend.
Da führt Google extra eine NetworkOnMainThread Exception ein, weil einfach so viele es falsch gemacht haben und was fällt den Leuten ein?
Nicht richtig zu programmieren, sondern möglichst die Einschränkung zu umgehen.

Ich behaupte jetzt mal bei Google sitzen sehr viel kluge Köpfe die sich schon was dabei gedacht haben, dass man es eben nicht im GUI Thread ausführt.

Warum versucht man es dann zu umgehen, statt es richtig zu machen.
Genau wegen sowas hat Android was die Apps angeht wohl einen schlechteren Ruf als Apple.
 
  • Danke
Reaktionen: kleinerkathe, DieGoldeneMitte und swordi
amfa schrieb:
Genau wegen sowas hat Android was die Apps angeht wohl einen schlechteren Ruf als Apple.

Wenigstens kriegt die App selber dann auch miese Kritiken :D
 
Nicht zwingend, wenn die Netzwerkoperation nämlich noch so schnell läuft, dass die App zwar kurz einfriert aber noch so schnell wieder reagiert, dass keine ANR Meldung kommt, schieben die meisten das nach meinem Gefühl eher auf das "lahme Android" bzw ihr "lahmes Smartphone" und nicht auf die mies programmierte App ;)
 
Aus diesem Grund frage ich ja eben hier im Forum nach welche Vorgehensweise die beste ist bevor ich meine App entsprechend schreibe...

Habe es nun via AsyncTask implementiert, kann sie in meiner Main-klasse mit dem .execute()-Befehl ausführen und meine Datenbank wird auch entsprechend beschrieben, funktioniert also sehr gut.

Was ich jedoch nicht verstehe ist, wie mein Thread Daten an meine MainActivity abgibt, hierzu gehört in erster Linie das Ergebnis des Http-Aufrufs (In meinem Fall ist es ein durch PHP erzeugtes, in JSON geparstes Abbild der Datenbank) aber auch Fehlermeldungen wie beispielsweise Netzwerkprobleme sollten an die GUI übergeben werden.

Kann mir da jemand ein paar Denkanstöße geben? Hab excplizit dafür im Internet keine Beispielcode gefunden.
 
glaub ich nicht ganz, dass das in den beispielen nicht gezeigt wird.

du lädst deine daten im doInBackground. Das ist ein separater thread

das result dieser methode wird dann an onPostExecute übergeben. Dort befindest du dich dann wieder im UI Thread.

Dort kannst damit machen was du willst. zb: setze einen callback (interface) in deiner mainactivity und gibs dem task.
 
amfa schrieb:
Genau wegen sowas hat Android was die Apps angeht wohl einen schlechteren Ruf als Apple.

Immer noch besser als Apple. Die hatten in ihrem Beispiel vergessen, die Internetverbindungen zu schließen. Einer der Gründe, warum das iphone gerne das WLAN zumüllen.

Zu Object-C fällt mir nur ein Wahlspruch ein: "It's not a bug, it's a feature." ;)
 
Mit IOS hatte ich bisher nichts zu tun ;)
Und mit Objective-C auch nicht.
Weil ich mir kein Mac kaufen wollte nur um auszuprobieren ob das überhaupt Spaß macht ;)
Und die jährliche Gebühr für den Appstore hat mich auch abgeschreckt ;)
 
naja wenn das ernsthaft betreiben willst, werden die paar euro jährliche gebühr aber jetzt kein hindernis sein.

extra dafür einen mac kaufen macht aber schon sinn ja. ist net grade billig.
 

Ähnliche Themen

S
Antworten
8
Aufrufe
511
swa00
swa00
L
Antworten
15
Aufrufe
909
jogimuc
J
Zurück
Oben Unten