Android的HttpEntityUtils OutOfMemoryException异常 [英] Android HttpEntityUtils OutOfMemoryException

查看:251
本文介绍了Android的HttpEntityUtils OutOfMemoryException异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在上连接到Web服务器并接收二进制数据的项目。我的问题是,当我从Web服务器下载数据。如果我发送请求登录到激活一些设置,是没有问题的。但是,当我将请求发送下载二进制数据,它扔我一个 OutOfMemoryException异常。下面是我使用的code:

 公共字节[] activateColl(INT指数){
        createCancelProgressDialog(,与你Communcating ......,取消);

        byte []的缓冲区=新的字节[1024];
        尝试 {
                HttpClient的=新DefaultHttpClient();
                httppost =新HttpPost(http://www.rpc.frbr.com);

                TelephonyManager TM =(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
                字符串的DeviceID = tm.getDeviceId();
                Log.w(device_identificator,device_identificator:+的DeviceID);
                字符串分辨率= Integer.toString(getWindow()。getWindowManager()。getDefaultDisplay()的getWidth())+X+
                                             Integer.toString(getWindow()getWindowManager()getDefaultDisplay()的getHeight()。);
                Log.w(device_resolution,device_resolution:+分辨率);
                字符串版本=机器人+ Build.VERSION.RELEASE;
                Log.w(device_os_type,device_os_type:+版);
                Log.w(device_identification_string,device_identification_string:+版);
                。string地区= getResources()getConfiguration()locale.toString();
                Log.w(set_locale,set_locale:+区域);
                字符串clientApiVersion = NULL;

                PackageManager下午= this.getPackageManager();
                PackageInfo packageInfo = pm.getPackageInfo(this.getPackageName(),0);
                clientApiVersion = packageInfo.versionName;
                Log.w(client_api_ver,client_api_ver:+ clientApiVersion);

                散列= getAuthHash();

                TelephonyManager TMGR =(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
                phoneNumber的= tMgr.getLine1Number();
                Log.i(手机,电话号码+ phoneNumber的);

                Log.w(索引,INDEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:+ Integer.toString(指数));

                字符串timestampSQL =SELECT DBTIMESTAMP用户的;
                光标光标= systemDbHelper.executeSQLQuery(timestampSQL);
                如果(cursor.getCount()== 0){
                    Log.i(光标,时间戳光标空!);
                }否则如果(cursor.getCount()大于0){
                    cursor.moveToFirst();
                    的timeStamp = cursor.getString(cursor.getColumnIndex(DBTIMESTAMP));
                }


                postParameters =新的ArrayList<的NameValuePair>();
                postParameters.add(新BasicNameValuePair(debug_data,1));
                postParameters.add(新BasicNameValuePair(client_auth_hash,散列));
                postParameters.add(新BasicNameValuePair(时间戳,时间戳));
                postParameters.add(新BasicNameValuePair(MOBILE_PHONE,phoneNumber的));
                postParameters.add(新BasicNameValuePair(activate_collections,Integer.toString(索引)));
                postParameters.add(新BasicNameValuePair(device_identificator,DEVICEID));
                postParameters.add(新BasicNameValuePair(device_resolution,分辨率));

                httppost.setEntity(新UrlEn codedFormEntity(postParameters));

                HTT presponse响应= httpclient.execute(httppost);
                Log.w(响应,状态行:+ response.getStatusLine()的toString());

                缓冲= EntityUtils.toByteArray(response.getEntity());

            }赶上(ParseException的E){
                e.printStackTrace();
            }赶上(IOException异常E){
                e.printStackTrace();
            }赶上(的NameNotFoundException E){
                e.printStackTrace();
            }
                返回缓冲区;
        }
 

从LogCat中错误:

  10-17 17:53:00.198:ERROR / AndroidRuntime(15486):java.lang.OutOfMemoryError
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在org.apache.http.util.ByteArrayBuffer.expand(ByteArrayBuffer.java:57)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在org.apache.http.util.ByteArrayBuffer.append(ByteArrayBuffer.java:75)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在org.apache.http.util.EntityUtils.toByteArray(EntityUtils.java:80)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在com.stampii.stampii.synchronization.Synchronization.deactivateColl(Synchronization.java:843)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在com.stampii.stampii.synchronization.Synchronization.onCreate(Synchronization.java:116)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.app.ActivityThread.access $ 2300(ActivityThread.java:135)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2136)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.os.Handler.dispatchMessage(Handler.java:99)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.os.Looper.loop(Looper.java:144)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在android.app.ActivityThread.main(ActivityThread.java:4937)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在java.lang.reflect.Method.invokeNative(本机方法)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在java.lang.reflect.Method.invoke(Method.java:521)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-17 17:53:00.198:ERROR / AndroidRuntime(15486):在dalvik.system.NativeStart.main(本机方法)
 

任何想法如何解决这个问题?我想提高我的缓冲区的大小为50 * 1024,但仍于事无补。

编辑:错误是投在该行:

 缓冲= EntityUtils.toByteArray(response.getEntity());
 

解决方案

好吧,试试这个..

 的Htt presponse响应= httpclient.execute(httppost);
 //得到响应实体
 HttpEntity实体= response.getEntity();
 //转换实体响应串
   如果(实体!= NULL)
    {
     InputStream的是= entity.getContent();
     //流转换为字符串
     结果= convertStreamToString(是);
     结果= result.replace(\ N,);

   }
 

和为转换为InputStream为String

 公共字符串convertStreamToString(InputStream中的InputStream)
{
 BufferedReader中R =新的BufferedReader(新的InputStreamReader(InputStream中));
 StringBuilder的总=新的StringBuilder();
 串线;
  而((行= r.readLine())!= NULL){
    total.append(线);
  }
返回total.toString();
}
 

使用Apache共享库(org.apache.commons.io.IOUtils)。

 字符串总= IOUtils.toString(InputStream的);
 

或只写临时文件,

  HttpEntity.writeTo(OutputStream的);
 

确定为每个用户菲利普Reichart建议,从包 org.apache.http.util ;

  EntityUtils.toString();
 

时的方法,它允许与字符串转换的编码格式

让我知道你仍然得到内存溢出错误

感谢。

I'm working on a project which connect to a web server and receive binary data. My problem is when I'm downloading data from web server. If i send request to login or to activate some setting, there is no problem. But when I send request to download a binary data it's throwing me an OutOfMemoryException. Here is the code which I'm using :

public byte[] activateColl(int index) {
        createCancelProgressDialog("","Communcating with you...","Cancel");

        byte[] buffer = new byte[1024];
        try {
                httpclient = new DefaultHttpClient();
                httppost = new HttpPost("http://www.rpc.frbr.com");

                TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                String deviceId = tm.getDeviceId();
                Log.w("device_identificator","device_identificator : "+deviceId);
                String resolution = Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getWidth())+ "x" +
                                             Integer.toString(getWindow().getWindowManager().getDefaultDisplay().getHeight());
                Log.w("device_resolution","device_resolution : "+resolution);
                String version = "Android " + Build.VERSION.RELEASE;
                Log.w("device_os_type","device_os_type : "+version);
                Log.w("device_identification_string","device_identification_string : "+version);
                String locale = getResources().getConfiguration().locale.toString();
                Log.w("set_locale","set_locale : "+locale);
                String clientApiVersion = null;

                PackageManager pm = this.getPackageManager();
                PackageInfo packageInfo = pm.getPackageInfo(this.getPackageName(), 0);
                clientApiVersion = packageInfo.versionName;
                Log.w("client_api_ver","client_api_ver : "+clientApiVersion);

                hash = getAuthHash();

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

                Log.w("INDEX","INDEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX : "+Integer.toString(index));

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


                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("activate_collections",Integer.toString(index)));
                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());

                buffer = EntityUtils.toByteArray(response.getEntity());

            } catch (ParseException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (NameNotFoundException e) {
                e.printStackTrace();
            }
                return buffer;
        }

Error from the LogCat:

10-17 17:53:00.198: ERROR/AndroidRuntime(15486): java.lang.OutOfMemoryError
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at org.apache.http.util.ByteArrayBuffer.expand(ByteArrayBuffer.java:57)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at org.apache.http.util.ByteArrayBuffer.append(ByteArrayBuffer.java:75)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at org.apache.http.util.EntityUtils.toByteArray(EntityUtils.java:80)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at com.stampii.stampii.synchronization.Synchronization.deactivateColl(Synchronization.java:843)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at com.stampii.stampii.synchronization.Synchronization.onCreate(Synchronization.java:116)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.app.ActivityThread.access$2300(ActivityThread.java:135)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.os.Looper.loop(Looper.java:144)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at android.app.ActivityThread.main(ActivityThread.java:4937)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at java.lang.reflect.Method.invokeNative(Native Method)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at java.lang.reflect.Method.invoke(Method.java:521)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-17 17:53:00.198: ERROR/AndroidRuntime(15486):     at dalvik.system.NativeStart.main(Native Method)

Any ideas how to fix that? I tried to increase my buffer's size to 50*1024,but still doesn't help.

EDIT: Error is throws on that line :

buffer = EntityUtils.toByteArray(response.getEntity());

解决方案

Ok, try this..

HttpResponse response = httpclient.execute(httppost);         
 // get response entity 
 HttpEntity entity = response.getEntity();          
 // convert entity response to string  
   if (entity != null) 
    {      
     InputStream is = entity.getContent();     
     // convert stream to string    
     result = convertStreamToString(is);      
     result = result.replace("\n", "");     

   } 

And for conversion of InputStream to String

public String convertStreamToString(InputStream inputStream)
{
 BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
 StringBuilder total = new StringBuilder();
 String line;
  while ((line = r.readLine()) != null) {
    total.append(line);
  }
return total.toString();
}

or

use Apache Commons library (org.apache.commons.io.IOUtils).

  String total = IOUtils.toString(inputStream);

or just write to temp file,

  HttpEntity.writeTo(OutputStream);

Ok as per user Philipp Reichart suggested, from package of org.apache.http.util;

EntityUtils.toString(); 

is the method which allow the encoding format with String Conversion.

and let me know still you get OutOfMemory Error.

Thanks.

这篇关于Android的HttpEntityUtils OutOfMemoryException异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆