Android (Java) URLConnection ich verzweifel

OP #4290469
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.
#4290764
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.
#4290927
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.
OP #4291532
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 :(
#4291968
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.
Gast #4293526
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
Gast #4302651
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren