2011-10-19 54 views
1

我需要一点帮助,从我的Android应用程序发送HttpUrlConnection。直到现在,我正在做这个基本Http Client。但问题是,当我从服务器收到一个大流时,我的应用程序崩溃了outofmemory异常。这就是为什么我做了一项研究,并发现HttpUrlConnection让我能够把这个流变成一个片断。那么有人可以帮我发一些参数,并从服务器获得响应吗?android HttpUrlConnection发送帖子和参数获取请求

,我用上面的代码是这样的:

   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

问题是响应太大,我无法将其转换为字符串并解析它。我需要找到一种方法来将它分解成碎片,并且正如我在android文档中看到的那样,httpurlconnection是一种更好的方法来完成这项工作,但对于了解如何发布同步参数等,有点困难。 –

+0

多少反应很大?有很多人正在使用与我们建议的服务器响应相同的技术。 – user370305

回答

0

这里是你可以用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(); 
    }