Hallo, ich schreibe mir zurzeit eine kleine App. Diese soll einen geteilten Link eigentlich nur per HTTP an meinen Server weiter geben. Dieser soll dann eine "ID" zurück geben und nach ein paar Sekunden (15-20) soll die App abfragen ob der Server fertig ist. Alles anhand der ID. Das stellt zwar so kein Problem dar jedoch bekomme ich einfach keine HTTP Connection hin. Ich habe zich Seiten durch, examples, tutorials. Es bringt nichts. Ich bekomme einfach keine Verbindung (sehe ich ja in den LOG Dateien meinen Servers). Ich habe mal den Code angehangen. Ich weiss einfach nicht mehr weiter. Hier mal der Code: http://nopaste.inside-irc.net/paste/AZSnPWELb/ Ab Zeile 91 will ich die "Abfrage" machen aber ich bekomme einfach keine Verbindung. Permissions sind gesetzt. Wenn ich die App jetzt so ausführe und ich klicke auf den Button dann kommt. "Diese App wurde leider beendet" oder so ähnlich -.- Ich verzweifel.
Rene H. schrieb: > Ab Zeile 91 will ich die "Abfrage" machen aber ich bekomme einfach keine > Verbindung. Permissions sind gesetzt. Woher weisst du, dass das Problem dort liegt? Hast du es mit dem Debugger genauer untersucht? Sonst ist es praktisch unmöglich herauszufinden, ob irgendwo ein Null-Pointer war, oder der Cast fehlschlug, oder eine Exception auftrat, oder das Problem woanders lag, oder... Hat Android nicht auch Logfiles? Villeicht ist auch dort etwas zu finden.
Mein Handy ist nicht gerootet da ist das mit den Logs ein wenig schwer. Ich sehe aber anhand meines Root servers ob ne connection erfolgte und dies ist leider nicht so. Java ist halt ziemlich kompliziert.
das hat der schon im Chat gefragt und war dazu ziemlich Beratungsresistent. Da haben wir ihn schonmal zur httpUrlConnection bzw httpsURLConenction mit ClassCastException gebracht.
Rene H. schrieb: > Mein Handy ist nicht gerootet da ist das mit den Logs ein wenig schwer. was hindert dich dran, diese code erstmals auf dem PC zu testen? auch gibt es den Simulator für Android.
Rene H. schrieb: > Mein Handy ist nicht gerootet da ist das mit den Logs ein wenig schwer. Desweiteren muss Android nicht gerootet sein, damit man direkt darauf debuggen kann. Google mal nach "Entwickleroptionen". Hast du auch dran gedacht, dass Netzwerk-Aufgaben immer in einem Hintergrund-Task ausgeführt werden müssen? Im Haupttask ist das meines Wissens nicht möglich.
Ich habe mir jetzt mal den code getestet:
1 | import java.io.BufferedReader; |
2 | import java.io.IOException; |
3 | import java.io.InputStreamReader; |
4 | import java.net.HttpURLConnection; |
5 | import java.net.URL; |
6 | import java.net.URLEncoder; |
7 | |
8 | /** |
9 | * |
10 | * A complete Java class that shows how to open a URL, then read data (text) from that URL, |
11 | * HttpURLConnection class (in combination with an InputStreamReader and BufferedReader). |
12 | * |
13 | * @author alvin alexander, devdaily.com. |
14 | * |
15 | */ |
16 | public class Main |
17 | { |
18 | public static void main(String[] args) |
19 | throws Exception |
20 | { |
21 | new Main(); |
22 | } |
23 | |
24 | public Main() |
25 | { |
26 | try |
27 | { |
28 | String myUrl = "http://www.amazon.de"; |
29 | // if your url can contain weird characters you will want to |
30 | // encode it here, something like this: |
31 | // myUrl = URLEncoder.encode(myUrl, "UTF-8"); |
32 | |
33 | String results = doHttpUrlConnectionAction(myUrl); |
34 | System.out.println(results); |
35 | } |
36 | catch (Exception e) |
37 | { |
38 | // deal with the exception in your "controller" |
39 | } |
40 | } |
41 | |
42 | /** |
43 | * Returns the output from the given URL. |
44 | * |
45 | * I tried to hide some of the ugliness of the exception-handling |
46 | * in this method, and just return a high level Exception from here. |
47 | * Modify this behavior as desired. |
48 | * |
49 | * @param desiredUrl |
50 | * @return |
51 | * @throws Exception |
52 | */ |
53 | private String doHttpUrlConnectionAction(String desiredUrl) |
54 | throws Exception |
55 | { |
56 | URL url = null; |
57 | BufferedReader reader = null; |
58 | StringBuilder stringBuilder; |
59 | |
60 | try |
61 | { |
62 | // create the HttpURLConnection |
63 | url = new URL(desiredUrl); |
64 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
65 | |
66 | // just want to do an HTTP GET here |
67 | connection.setRequestMethod("GET"); |
68 | |
69 | // uncomment this if you want to write output to this url |
70 | //connection.setDoOutput(true); |
71 | |
72 | // give it 15 seconds to respond |
73 | connection.setReadTimeout(15*1000); |
74 | connection.connect(); |
75 | |
76 | // read the output from the server |
77 | reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); |
78 | stringBuilder = new StringBuilder(); |
79 | |
80 | String line = null; |
81 | while ((line = reader.readLine()) != null) |
82 | { |
83 | stringBuilder.append(line + "\n"); |
84 | } |
85 | return stringBuilder.toString(); |
86 | } |
87 | catch (Exception e) |
88 | { |
89 | e.printStackTrace(); |
90 | throw e; |
91 | } |
92 | finally |
93 | { |
94 | // close the reader; this can throw an exception too, so |
95 | // wrap it in another try/catch block. |
96 | if (reader != null) |
97 | { |
98 | try |
99 | { |
100 | reader.close(); |
101 | } |
102 | catch (IOException ioe) |
103 | { |
104 | ioe.printStackTrace(); |
105 | } |
106 | } |
107 | } |
108 | } |
109 | } |
Der klappt. Nur habe ich keine Ahnung wie ich den in meinen Android Code kriegen soll. Keine Ahnung von Java :(
:
Bearbeitet durch User
Android ist ja auch null java wenn man erwartet das es fast gleich ist ;) Ich musste mal kurz selbst suchen und habe gleich den ersten google eintrag als Erwähnenswert gefunden.
1 | URL url = new URL("http://blabla"); |
2 | HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); |
3 | conn.setReadTimeout(10000); |
4 | conn.setConnectTimeout(15000); |
5 | conn.setRequestMethod("POST"); |
6 | conn.setDoInput(true); |
7 | conn.setDoOutput(true); |
8 | |
9 | List<NameValuePair> params = new ArrayList<NameValuePair>(); |
10 | params.add(new BasicNameValuePair("firstParam", paramValue1)); |
11 | params.add(new BasicNameValuePair("secondParam", paramValue2)); |
12 | params.add(new BasicNameValuePair("thirdParam", paramValue3)); |
13 | |
14 | OutputStream os = conn.getOutputStream(); |
15 | BufferedWriter writer = new BufferedWriter( |
16 | new OutputStreamWriter(os, "UTF-8")); |
17 | writer.write(getQuery(params)); |
18 | writer.flush(); |
19 | writer.close(); |
20 | os.close(); |
21 | |
22 | conn.connect(); |
wichtig ist zur Fehlerbehandlung in Try&catch einbetten und immer Code+Fehlermeldung posten.
Ich habs jetzt am laufen. Jedoch mit 3 Bugs. Manchmal bleibt der Download einfach stehen und das was es dann. Manchmal läuft er durch. In beiden fällen "steht" die App danach. Also man muss sie dann über Home schliessen. Back button usw geht nicht mehr. Weiss jemand warum?
Wenn du eine Android App entwickelst solltest du dich mit der Android API und NICHT mit der Java API beschäftigen! Es gibt hier MASSIVE unterschiede, auch wenn beides in der gleichen Sprache programmiert wird. Seit dem API Level 17 oder 18 ist es zB erforderlich, dass HTTP bzw. Netzwerkverbindungen in einem Asynchronen Task bearbeitet werden. Schau dir am besten mal die Android Tutorials an inkl. der dort verwendeten Methoden etc. Außerdem ist es sinnvoll per ADB oder Chrome die Anwendung zu debuggen und Logs, Traces auszugeben
App abstürze macht man mit try&catch. Try{meinfehlercode}catch(){popup download fehlgeschlagen} So wird eine Exception Abgefangen ohne das Programm zu beenden
Philipp Kuhrs schrieb: > App abstürze macht man mit try&catch. Nutzt dem OP nix, URLconnection hat Methoden, die lange "hängen" können, wenn ein Server oder das Inet lahmt. Der OP sollte sich lieber mal mit AsyncTask<> beschäftigen. Der kann abbrechbar gestaltet werden.
Jim M. schrieb: > Nutzt dem OP nix, URLconnection hat Methoden, die lange "hängen" können, > wenn ein Server oder das Inet lahmt. Wenn der OP schon an einfachen unleserlichen Exceptions hängenbleibt, sich über Abstürze "App wird geschlossen" beschwert und heult das er keine Fehlermeldungen bekommt dann bringt ihm der Tausendmalige Hinweis immer noch nichts.. Ich gehe mal davon aus das der OP alles lokal testet.. ich habe immer nur Try&Catch bzw Services benutzt.. allerdings ist das letzt Tool schon etwas her. Kann man bei der ganzen Sache keinen Timeout integrieren wie oben schon im Post vorhanden?
Müsste nicht sowieso die TimeoutException mit Try&Catch abgefangen werden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.