2014-01-19 7 views
5
verbunden

ich eine Probe von Code zu testen, aber es ist immer Fehler bei connection.setDoInput(true);Android: java.lang.IllegalStateException: Bereits

HttpsURLConnection connection = null; 
DataOutputStream outputStream = null; 
DataInputStream inputStream = null; 

String urlServer = "https://www.myurl.com/upload.php"; 
String lineEnd = "\r\n"; 
String twoHyphens = "--"; 
String boundary = "*****"; 

int bytesRead = 0; 
int bytesAvailable = 0; 
int bufferSize = 0; 
byte[] buffer = null; 
int maxBufferSize = 1*1024*1024; 

try { 
    FileInputStream fileInputStream = new FileInputStream(new File(params[0])); 

    URL url = new URL(urlServer); 

    connection = (HttpsURLConnection) url.openConnection(); 
    connection.setConnectTimeout(1000); 

    // Allow Inputs & Outputs 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    connection.setUseCaches(false); 

    // Enable POST method 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 

    connection.setConnectTimeout(1000); 

    outputStream = new DataOutputStream(connection.getOutputStream()); 
    outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
    outputStream.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + params[0] + "\"" + lineEnd); 
    outputStream.writeBytes(lineEnd); 

    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    buffer = new byte[bufferSize]; 

    // Read file 
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

    while (bytesRead > 0) { 
     outputStream.write(buffer, 0, bufferSize); 
     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    } 

    outputStream.writeBytes(lineEnd); 
    outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

Das Fehlerprotokoll ist java.lang.IllegalStateException: Already connected. Ich habe versucht, diese aber nicht funktioniert:

connection.setRequestProperty("Connection", "close"); 
connection.disconnect(); 
connection.setConnectTimeout(1000); 

EDIT: auch wenn ich nicht connection.connect() angerufen hat, ist es immer noch already connected den gleichen Fehler zu geben.

+0

Haben Sie 'OutputStreamWriter' und' InputStreamReader' nach der Verwendung geschlossen? – alfasin

+0

ja.und der Fehler ist aufgetreten, bevor die Zeile von OutputStreamWriter und InputStreamReader verwendet wurde. –

+0

@ downvoter: warum ist es downvoted? Ich lese bereits und versuchte andere ähnliche Frage und keiner funktioniert, deshalb poste ich dieses. –

Antwort

0

Verschieben

connection.connect(); 

nach

connection.setRequestMethod("POST"); 
+2

Brian hat diese Antwort bereits vor 16 Minuten gepostet ... – alfasin

0

gibt es einen sehr guten Beitrag über HTTP-Verbindungen here

Unterm Strich, dass für POSTs ist, müssen Sie nur die folgenden.

HttpURLConnection connection = (HttpURLConnection) new URL(urlToRead).openConnection(); 
// setDoOutput(true) implicitly set's the request type to POST 
connection.setDoOutput(true); 

Ich bin nicht sicher, dass Sie auch HttpsURLConnection angeben müssen. Sie können HttpURLConnection für die Verbindung zu HTTP-Sites verwenden. Lassen Sie Java hinter den Kulissen die Arbeit für Sie erledigen. Hier

ist der POST-Code, den ich für json Beiträge

public static String doPostSync(final String urlToRead, final String content) throws IOException { 
    final String charset = "UTF-8"; 
    // Create the connection 
    HttpURLConnection connection = (HttpURLConnection) new URL(urlToRead).openConnection(); 
    // setDoOutput(true) implicitly set's the request type to POST 
    connection.setDoOutput(true); 
    connection.setRequestProperty("Accept-Charset", charset); 
    connection.setRequestProperty("Content-type", "application/json"); 

    // Write to the connection 
    OutputStream output = connection.getOutputStream(); 
    output.write(content.getBytes(charset)); 
    output.close(); 

    // Check the error stream first, if this is null then there have been no issues with the request 
    InputStream inputStream = connection.getErrorStream(); 
    if (inputStream == null) 
     inputStream = connection.getInputStream(); 

    // Read everything from our stream 
    BufferedReader responseReader = new BufferedReader(new InputStreamReader(inputStream, charset)); 

    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = responseReader.readLine()) != null) { 
     response.append(inputLine); 
    } 
    responseReader.close(); 

    return response.toString(); 
} 
1
  1. Sie müssen den Eingangsstrom schließen, nachdem die Lektüre von Strom zu beenden.

  2. Sie sollten entfernen den Anruf an connect(). Sie haben es an der falschen Stelle, aber es ist automatisch und muss überhaupt nicht aufgerufen werden.

  3. Sie können auch die Zeile entfernen, die POST setzt. Dies ist beim Aufruf von setDoOutput(true) implizit.

  4. Sie können auch den größten Teil dieses Cruds in der Kopierschleife entfernen. Verwenden Sie einen Puffer fester Größe:

    while ((count = in.read(buffer)) > 0) 
    { 
        out.write(buffer, 0, count); 
    } 
    

    Verwenden Sie keinen neuen Puffer pro Lesevorgang; Rufen Sie nicht available(); GO nicht passieren; Sammle keine $ 200 ein.

-1

hinzufügen

if (connection != null) connection.disconnect(); 

vor

connection = (HttpsURLConnection) url.openConnection(); 

Sehen Sie, wenn Problem gelöst. Wenn ja, bedeutet dies, dass connection.disconnect() nicht in Ihrem ursprünglichen Code aufgerufen wird. Vielleicht steckst du connection.disconnect() am Ende deines try Blocks, jedoch tritt eine Ausnahme davor auf, also springt es zum catch-Block und connection.disconnect() wird nie aufgerufen.

Verwandte Themen