android HttpUrlConnection发送post和参数get请求

android HttpUrlConnection发送post和参数get请求,android,httpclient,httpurlconnection,Android,Httpclient,Httpurlconnection,我需要一些帮助,从我的android应用程序发送HttpUrlConnection。到目前为止,我是用一个基本的Http客户机来完成这项工作的。但问题是,当我从服务器接收到一个大数据流时,我的应用程序崩溃,出现outofmemory异常。这就是为什么我做了一项研究,发现HttpUrlConnection可以让我将流分成一个片段。那么,有谁能帮我发送参数并从服务器获取响应呢 我之前使用的代码是: httpclient = new DefaultHttpClient(

我需要一些帮助,从我的android应用程序发送HttpUrlConnection。到目前为止,我是用一个基本的Http客户机来完成这项工作的。但问题是,当我从服务器接收到一个大数据流时,我的应用程序崩溃,出现outofmemory异常。这就是为什么我做了一项研究,发现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();

以下是使用HttpURLConnecion与web服务器建立连接的方法:

        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();
    }

我看到你仍然面临着同样的问题,所以我认为你错过了我们之前提供的一些东西,或者是错误地使用了它。你能提供完整的代码让我们检查一下吗。问题是响应太大,我无法将其转换为字符串并解析它。我需要找到一种方法将其分解,正如我在android文档中看到的,httpurlconnection是一种更好的方法,但我有点难以理解如何发布同步参数等。有多少响应是巨大的?很多人都在使用与我们建议的服务器响应相同的技术。实际上,每次都不一样……在某些情况下,我只能获得1-2MB,在其他一些情况下,我可以获得100MB,这取决于用户需要什么。如果你想看,我可以向你展示我的全部代码。如果你想看,有代码:
        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();
    }