Forum: PC-Programmierung Android (Java) URLConnection ich verzweifel


von Rene H. (ballibou77)


Lesenswert?

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.

von Daniel A. (daniel-a)


Lesenswert?

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.

von Rene H. (ballibou77)


Lesenswert?

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.

von Schupp (Gast)


Lesenswert?

das hat der schon im Chat gefragt und war dazu ziemlich 
Beratungsresistent.

Da haben wir ihn schonmal zur httpUrlConnection bzw httpsURLConenction 
mit ClassCastException gebracht.

von Peter II (Gast)


Lesenswert?

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.

von Little B. (lil-b)


Lesenswert?

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.

von Rene H. (ballibou77)


Lesenswert?

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
von Philipp K. (philipp_k59)


Lesenswert?

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.

von Rene H. (ballibou77)


Lesenswert?

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?

von TestX (Gast)


Lesenswert?

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

von Philipp Kuhrs (Gast)


Lesenswert?

App abstürze macht man mit try&catch.

Try{meinfehlercode}catch(){popup download fehlgeschlagen}

So wird eine Exception Abgefangen ohne das Programm zu beenden

von Jim M. (turboj)


Lesenswert?

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.

von Schupp (Gast)


Lesenswert?

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?

von Philipp K. (philipp_k59)


Lesenswert?

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
Noch kein Account? Hier anmelden.