Android 使用Post从服务器读取大型xml文件时内存不足
我正在使用下面的代码从服务器获取xml文件,由于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
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