我在我的Android应用程序上使用Jsoup,通过webservice restful读取xml文件。
Jsoup库完美运行,直到xml文件包含少量记录。
但是当我得到一个包含50k或60k记录的xml时,我发现Jsoup分配内存直到230MB 240MB。这是一个问题,因为
android:largeHeap="true"
我有256MB内存可分配。
这是一个saple代码,亲自尝试
public class MainActivity extends ActionBarActivity {
private static Handler mHandler = new Handler();
private static Context context;
static TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView.setText("5 seconds to start task");
context = this.getApplicationContext();
mHandler.postDelayed(new Runnable() {
public void run() {
new syncDataWS(context).execute();
}
}, 5000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private static class syncDataWS extends AsyncTask<Void, String, Void> {
Context mContext;
public syncDataWS(Context context) {
this.mContext = context;
}
@Override
public void onPreExecute() {
super.onPreExecute();
textView.append("\nStart task");
}
@Override
protected Void doInBackground(Void... params) {
try {
publishProgress("Start call XML page");
Document WS_Document = Jsoup.connect("XML_EXAMPLE").maxBodySize(0).timeout(10 * 100000).get();
publishProgress("End call XML page");
publishProgress("Get rows of document");
Elements XML_RESULT_WS = WS_Document.select("row");
publishProgress("Record number : " + Integer.toString(XML_RESULT_WS.size()));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
if (values != null && values.length > 0) {
textView.append("\n" + values[0]);
}
}
@Override
protected void onPostExecute(Void result) {
textView.append("\nEnd task");
}
}
}
这是xml
的一个例子<XMLDataResponse xmlns="www.example.net"><XMLDataResult><root xmlns=""><row ID="1" ID2="2" ID3="3" ID4="4" F1="0.000000000000000e+000" F2="0.000000000000000e+000" F3="0.000000000000000e+000" F4="" F5="0.000000000000000e+000" F6="0.000000000000000e+000"/></root></XMLDataResult></XMLDataResponse>
获取行标记并复制+粘贴它,直到XML示例中有6万条记录。把它放在你想要的任何地方,只要它可以通过http调用(URL)实现。复制代码中的网址
Jsoup.connect("COPY URL OF XML HERE")
你可以看到我的意思。
我需要一个解决方案来解决这个分配问题,因为有时候,并非总是如此,分配到达256MB且我的应用程序崩溃了。
答案 0 :(得分:1)
你将无法用Jsoup解决这个问题,因为Jsoup从解析的XML中创建了一个完整的DOM树,它在你的内存中变得越来越大。 Jsoup btw。首先是一个HTML解析器。
我使用基于事件的XML解析器,如XMLPullParser。