【发布时间】:2015-09-30 07:10:22
【问题描述】:
我在我的 Android 应用程序上使用 Jsoup 来读取由 web 服务获取的 xml 文件。
Jsoup 库可以完美运行,直到 xml 文件包含少量记录。
但是当我得到一个包含 50k 或 60k 记录的 xml 时,我观察到 Jsoup 分配内存直到 230MB 到 240MB。这是一个问题,因为
android:largeHeap="true"
我有 256MB 的内存可分配。
这是一个简单的代码,你自己试试
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 示例中有 60,000 条记录。把它放在你想要的任何地方,只要它可以通过 http 调用 (URL) 实现。复制代码中的url
Jsoup.connect("COPY URL OF XML HERE")
你可以明白我的意思。
我需要一个解决方案来解决这个分配问题,因为有时(并非总是)分配达到 256MB 并且我的应用程序崩溃了。
【问题讨论】:
-
所以使用“sax”或“pull”xml解析器
标签: android xml performance xml-parsing jsoup