Android 使用Post从服务器读取大型xml文件时内存不足

Android 使用Post从服务器读取大型xml文件时内存不足,android,Android,我正在使用下面的代码从服务器获取xml文件,由于xml文件又重又大,所以它崩溃并显示内存不足问题 public class Connect { static BufferedReader in=null; String result=null; Context context; //Establish connection with web server public String HTTPConnect(String uri1,List<NameV

我正在使用下面的代码从服务器获取xml文件,由于xml文件又重又大,所以它崩溃并显示内存不足问题

 public class Connect {

   static BufferedReader in=null;
   String result=null;
   Context context;
   //Establish connection with web server
      public String HTTPConnect(String uri1,List<NameValuePair> list,Context context)
      {

    this.context=context;
    try {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(uri1);

        if(list!=null)
        {
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(list);

        httpPost.setEntity(formEntity);
        }

        HttpResponse httpResponse = httpClient.execute(httpPost);
       in = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
        StringBuffer sb = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");

        long heapSize = Runtime.getRuntime().totalMemory();

        if(in!=null)
        {
            while ((line = in.readLine()) != null) {//crasheg here
              sb.append(line + NL);
            }
            in.close();
        }

        result = sb.toString();


}
    catch(UnsupportedEncodingException e)
    {
        String err = (e.getMessage()==null)?"Cant connect to server":e.getMessage();

        ShowDialog();
    }
    catch (MalformedURLException e) {
        String err = (e.getMessage()==null)?"Malformed Exception":e.getMessage();

        ShowDialog();
     } 
     catch(Exception ex)
     {

         String err = (ex.getMessage()==null)?"NetworkConnectionException":ex.getMessage();

         ShowDialog();
     }
    finally {
        if (in != null) {
            try {
                    in.close();
             } catch (Exception ex) {
                 String err = (ex.getMessage()==null)?"Excepion":ex.getMessage();

                 ex.printStackTrace();

            }
        }

     }

    return result;

   }
公共类连接{
静态BufferedReader in=null;
字符串结果=null;
语境;
//与web服务器建立连接
公共字符串HTTPConnect(字符串uri1、列表、上下文)
{
this.context=context;
试一试{
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(uri1);
如果(列表!=null)
{
UrlEncodedFormEntity formEntity=新的UrlEncodedFormEntity(列表);
httpPost.setEntity(formEntity);
}
HttpResponse HttpResponse=httpClient.execute(httpPost);
in=new BufferedReader(新的InputStreamReader(httpResponse.getEntity().getContent());
StringBuffer sb=新的StringBuffer(“”);
字符串行=”;
字符串NL=System.getProperty(“line.separator”);
long heapSize=Runtime.getRuntime().totalMemory();
if(in!=null)
{
而((line=in.readLine())!=null){//crasheg here
sb.追加(行+NL);
}
in.close();
}
结果=sb.toString();
}
捕获(不支持的编码异常e)
{
字符串err=(e.getMessage()==null)?“无法连接到服务器”:e.getMessage();
ShowDialog();
}
捕获(格式错误){
字符串err=(e.getMessage()==null)?“格式错误的异常”:e.getMessage();
ShowDialog();
} 
捕获(例外情况除外)
{
字符串err=(例如getMessage()==null)?“NetworkConnectionException”:例如getMessage();
ShowDialog();
}
最后{
if(in!=null){
试一试{
in.close();
}捕获(例外情况除外){
字符串err=(例如getMessage()==null)?“Excepion”:例如getMessage();
例如printStackTrace();
}
}
}
返回结果;
}
我知道我正在以字符串形式复制整个XML,由于文件太重,它会崩溃。它在较小的XML文件中工作正常,但是对于较大的XML文件有什么替代方法。我使用SAX解析器来解析此XML文件

[编辑] 以下是日志:

 FATAL EXCEPTION: AsyncTask #4
 java.lang.RuntimeException: An error occured while executing doInBackground()
 at android.os.AsyncTask$3.done(AsyncTask.java:200)
 at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
 at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
 at java.util.concurrent.FutureTask.run(FutureTask.java:137)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
 at java.lang.Thread.run(Thread.java:1096)
 Caused by: java.lang.OutOfMemoryError
 java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
 java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:136)
 java.lang.StringBuilder.append(StringBuilder.java:272)
 java.io.BufferedReader.readLine(BufferedReader.java:452)
 com.kxs.appitize.Connect.HTTPConnect(Connect.java:56)
 com.kxs.appitize.ListRestaurants$Asyn_rest.doInBackground(ListRestaurants.java:168)
 com.kxs.appitize.ListRestaurants$Asyn_rest.doInBackground(ListRestaurants.java:1)
 01-at android.os.AsyncTask$2.call(AsyncTask.java:185)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
  Activity com.kxs.appitize.TabsMainActivity has leaked window    com.android.internal.policy.impl.PhoneWindow$DecorView@44f4fb28 that was originally added here
 android.view.WindowLeaked: Activity com.kxs.appitize.TabsMainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44f4fb28 that was originally added here
 at android.view.ViewRoot.<init>(ViewRoot.java:247)
 at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
 at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
 at android.view.Window$LocalWindowManager.addView(Window.java:424)
 at android.app.Dialog.show(Dialog.java:241)
 at com.kxs.appitize.ListRestaurants$Asyn_rest.onPreExecute(ListRestaurants.java:156)
 at android.os.AsyncTask.execute(AsyncTask.java:391)
 at com.kxs.appitize.ListRestaurants.onCreate(ListRestaurants.java:133)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
 at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
 at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
 at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
at com.kxs.appitize.TabGroupActivity.startChildActivity(TabGroupActivity.java:72)
  at com.kxs.appitize.ListCategories$1.onClick(ListCategories.java:109)
 at android.view.View.performClick(View.java:2408)
 at android.view.View$PerformClick.run(View.java:8816)
 at android.os.Handler.handleCallback(Handler.java:587)
  at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:123)     
 at android.app.ActivityThread.main(ActivityThread.java:4627)
 at java.lang.reflect.Method.invokeNative(Native Method)
 java.lang.reflect.Method.invoke(Method.java:521)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 at dalvik.system.NativeStart.main(Native Method)
致命异常:异步任务#4
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:200)
位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:124)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
位于java.util.concurrent.FutureTask.run(FutureTask.java:137)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
运行(Thread.java:1096)
原因:java.lang.OutOfMemoryError
java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
append0(AbstractStringBuilder.java:136)
append(StringBuilder.java:272)
readLine(BufferedReader.java:452)
com.kxs.appitize.Connect.HTTPConnect(Connect.java:56)
com.kxs.appitize.ListRestaurants$Asyn_rest.doInBackground(ListRestaurants.java:168)
com.kxs.appitize.ListRestaurants$Asyn_rest.doInBackground(ListRestaurants.java:1)
01位于android.os.AsyncTask$2.call(AsyncTask.java:185)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
Activity com.kxs.appitize.tabsma Inactivity已泄漏了Windows com.android.internal.policy.impl.PhoneWindow$DecorView@44f4fb28原来是加在这里的
android.view.WindowLeaked:Activity com.kxs.appitize.TabsMainActivity已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@44f4fb28原来是加在这里的
在android.view.ViewRoot(ViewRoot.java:247)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
在android.view.Window$LocalWindowManager.addView(Window.java:424)
在android.app.Dialog.show上(Dialog.java:241)
在com.kxs.appitize.ListRestaurants$Asyn_rest.onPreExecute(ListRestaurants.java:156)上
在android.os.AsyncTask.execute(AsyncTask.java:391)
位于com.kxs.appitize.ListRestaurants.onCreate(ListRestaurants.java:133)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)上
位于android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
在android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)上
在android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)上
位于com.kxs.appitize.TabGroupActivity.startChildActivity(TabGroupActivity.java:72)
在com.kxs.appitize.ListCategories$1.onClick上(ListCategories.java:109)
在android.view.view.performClick上(view.java:2408)
在android.view.view$PerformClick.run(view.java:8816)
位于android.os.Handler.handleCallback(Handler.java:587)
位于android.os.Handler.dispatchMessage(Handler.java:92)
位于android.os.Looper.loop(Looper.java:123)
位于android.app.ActivityThread.main(ActivityThread.java:4627)
位于java.lang.reflect.Method.Invokenactive(本机方法)
java.lang.reflect.Method.invoke(Method.java:521)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
在dalvik.system.NativeStart.main(本机方法)

尝试使用inputStream解析XML。inputStrem不会增加Android堆栈的大小,也不会使用大字符串。我对大JSON也有同样的想法,现在,我使用Jackson直接从流解析JSON

你可以找到equ