2015-04-22 6 views
0

Внутри AsyncTask Я хочу, чтобы отправлять данные:Невозможно создать OutputStream внутри AsyncTask

@Override 
     protected Void doInBackground(Void... params) { 

      ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 

      if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) { 

       //System.setProperty("http.keepAlive", "false"); 

       HttpURLConnection con = null; 
       OutputStream os = null; 
       OutputStreamWriter writer = null; 

       try { 
        String donnees = URLEncoder.encode("param1","UTF-8").concat("=").concat(URLEncoder.encode("valeur1","UTF-8")); 
        String strUrl = confUrl.concat("outil.php?action=OutilImporterDonneesMobile"); 
        URL url = new URL(strUrl); 
        con = (HttpURLConnection)url.openConnection(); 
        con.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
        con.setDoOutput(true); 
        con.setChunkedStreamingMode(0); 
        if (con != null && con.getResponseCode() == HttpURLConnection.HTTP_OK) { 
         try { 
          os = con.getOutputStream(); 
          if (os != null) { 
           writer = new OutputStreamWriter(os); 
           if (writer != null) { 
            writer.write(donnees); 
            writer.flush(); 
           } 
          } 
         } catch (IOException e) { 
          error = true; 
          err = "cannot create outputstream"; 
         } 
        } else { 
         error = true; 
         err = contextInsideSync.getResources().getString(R.string.errBadHTTPResponse); 
        } 
       } catch (MalformedURLException e) { 
        error = true; 
        err = contextInsideSync.getResources().getString(R.string.errBadUrl); 
       } catch (UnsupportedEncodingException e) { 
        error = true; 
        err = contextInsideSync.getResources().getString(R.string.errEncodageUTF8); 
       } catch (IOException e) { 
        error = true; 
        err = contextInsideSync.getResources().getString(R.string.errAccessError); 
       } catch (Exception eo) { 
        error = true; 
        err = eo.getMessage(); 
       } 
       finally { 
        if (writer != null) { try { writer.close(); } catch (IOException e) { 
         error = true; 
         err = contextInsideSync.getResources().getString(R.string.errAccessError); 
        } } 
        if (os != null) { try { os.close(); } catch (IOException e1) { 
         error = true; 
         err = contextInsideSync.getResources().getString(R.string.errAccessError); 
        } } 
        if (con != null) con.disconnect(); 
       } 

      } else { 
       error = true; 
       err = contextInsideSync.getResources().getString(R.string.errNoNetwork); 
      } 

      return null; 

     } 

Во время выполнения IOException возникает при попытке создать outputStream. Так что же не так?

+0

, пожалуйста, отправьте исключение –

+0

java.net.ProtocolException: не удается написать тело запроса после того, как ответ был прочитан – pheromix

ответ

2

Проблема в том, что вы отправляете HTTP-заголовок, а затем записываете вывод.

С этой линией:

con.getResponseCode() 

... вы на самом деле уже требуется отправить запрос.

Попробуйте открыть OutputStream и записать его перед вызовом getResponseCode();

+0

На самом деле 'getResponseCode()' не нужно? – pheromix

+0

Я бы назвал getResponseCode(), но после того, как вы закончили создание запроса. Вы можете/должны использовать его для определения того, был ли запрос успешным или нет. –

Смежные вопросы