2011-10-19 36 views
1

私のアンドロイドアプリケーションからHttpUrlConnectionを送信すると少し助けが必要です。これまでは基本的にHttp Clientでこれをやっていました。しかし、問題は、サーバから大きなストリームを受け取ったときに、私のアプリケーションがoutofmemoryの例外でクラッシュするということです。それで、私が研究をして、HttpUrlConnectionがストリームを断片にすることを可能にすることが分かったのです。だから誰も私のparamsを送信し、サーバーからの応答を取得することで少し私を助けることができますか?アンドロイドHttpUrlConnection投稿とparamsがリクエストを送信します

私が使っていた以前のコードはこれです:

   httpclient = new DefaultHttpClient(); 
       httppost = new HttpPost("http://www.rpc.your_nightmare.com"); 

       TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
       String deviceId = tm.getDeviceId(); 
       String resolution = Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getWidth())+ "x" + 
              Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getHeight()); 
       String version = "Android " + Build.VERSION.RELEASE; 
       String locale = getResources().getConfiguration().locale.toString(); 
       String clientApiVersion = null; 

       PackageManager pm = this.getPackageManager(); 
       PackageInfo packageInfo = pm.getPackageInfo(this.getPackageName(), 0); 
       clientApiVersion = packageInfo.versionName; 

       hash = getAuthHash(); 

       String timestampSQL = "SELECT dbTimestamp FROM users"; 
       Cursor cursor = systemDbHelper.executeSQLQuery(timestampSQL); 
       if(cursor.getCount()==0){ 
        Log.i("Cursor","TimeStamp Cursor Empty!"); 
       } else if(cursor.getCount()>0){ 
        cursor.moveToFirst(); 
        timeStamp = cursor.getString(cursor.getColumnIndex("dbTimestamp")); 
       } 

       TelephonyManager tMgr =(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); 
       phoneNumber = tMgr.getLine1Number(); 
       Log.i("Phone","Phone Number : "+phoneNumber); 

       postParameters = new ArrayList<NameValuePair>(); 
       postParameters.add(new BasicNameValuePair("debug_data","1")); 
       postParameters.add(new BasicNameValuePair("client_auth_hash", hash)); 
       postParameters.add(new BasicNameValuePair("timestamp", timeStamp)); 
       postParameters.add(new BasicNameValuePair("mobile_phone", phoneNumber)); 
       postParameters.add(new BasicNameValuePair("deactivate_collections",Integer.toString(index))); 
       postParameters.add(new BasicNameValuePair("client_api_ver", clientApiVersion)); 
       postParameters.add(new BasicNameValuePair("set_locale", locale)); 
       postParameters.add(new BasicNameValuePair("device_os_type", version)); 
       postParameters.add(new BasicNameValuePair("device_sync_type", "14")); 
       postParameters.add(new BasicNameValuePair("device_identification_string", version)); 
       postParameters.add(new BasicNameValuePair("device_identificator", deviceId)); 
       postParameters.add(new BasicNameValuePair("device_resolution", resolution)); 

       httppost.setEntity(new UrlEncodedFormEntity(postParameters)); 

       HttpResponse response = httpclient.execute(httppost); 
       Log.w("Response ","Status line : "+ response.getStatusLine().toString()); 

       HttpEntity entity = response.getEntity(); 
       InputStream stream2 = entity.getContent(); 


       int nRead; 
       byte[] data = new byte[8*1024]; 

       while ((nRead = stream2.read(data, 0, data.length)) != -1) { 
        buffer.write(data, 0, nRead); 
       } 

       buffer.flush(); 
       return buffer.toByteArray(); 

とこのようにそれを処理するより:ここ

InputStream stream = new ByteArrayInputStream(buffer, 0, temp.length); 
Log.i("Temp","Temp : "+temp.length); 
Log.i("index","index : "+index); 
responseBody = convertStreamToString(stream); 
Log.i("responseBody","responseBody : "+responseBody); 
//calculations 
+0

私はあなたがまだ同じ問題に直面しているのを見ます。私たちは早めに提供するか、間違って使って使用します。したがって、コード全体を確認して確認することができます。何をしようとしていますか? – user370305

+1

問題は応答が大きすぎて文字列に変換して解析できないということです。私はそれを取得する方法を見つける必要があり、私はアンドロイドのドキュメントを見て、httpurlconnectionはこれを行うためのより良い方法ですが、私は少し同期パラメータなどを投稿する方法を理解するのは難しいです –

+0

どのくらい応答は大きいですか?多くの人がサーバーからの応答に対して提案したのと同じテクニックを使用しています。 – user370305

答えて

0

は、Webへの接続を行うためにHttpURLConnecionを使用することができます方法ですサーバー:

 System.setProperty("http.keepAlive", "false"); 
     connection = (HttpURLConnection) new URL(url).openConnection(); 
     connection.setDoOutput(true); 
     connection.setConnectTimeout(5000); // miliseconds 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Connection", "Keep-Alive"); 
     connection.setRequestProperty("Charset", charset); 
     connection.setRequestProperty("Content-Type", 
       "application/x-www-form-urlencoded;charset=" + charset); 
     OutputStream output = null; 
     try { 
      output = connection.getOutputStream(); 
      output.write(query.getBytes(charset)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (output != null) 
       try { 
        output.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
     } 

     int status = ((HttpURLConnection) connection).getResponseCode(); 
     Log.d("", "Status : " + status); 

     for (Entry<String, List<String>> header : connection 
       .getHeaderFields().entrySet()) { 
      Log.d("Headers", 
        "Headers : " + header.getKey() + "=" 
          + header.getValue()); 
     } 

     InputStream response = new BufferedInputStream(
       connection.getInputStream()); 

     int bytesRead = -1; 
     byte[] buffer = new byte[30 * 1024]; 
     while ((bytesRead = response.read(buffer)) > 0 && stopThread) { 
      byte[] buffer2 = new byte[bytesRead]; 
      System.arraycopy(buffer, 0, buffer2, 0, bytesRead); 
      // buffer2 is you chunked response 
     } 
     connection.disconnect(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
関連する問題