android HttpUrlConnection отправить сообщение и параметры получить запрос - PullRequest
1 голос
/ 19 октября 2011

Мне нужна небольшая помощь с отправкой HttpUrlConnection из моего приложения для Android. До сих пор я делал это с базовым Http Client. Но проблема в том, что когда я получаю большой поток от сервера, мои приложения аварийно завершают работу с исключением 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();

и чем обрабатывать это так:

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

1 Ответ

0 голосов
/ 10 апреля 2012

Вот как вы можете использовать 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();
    }
...