【问题标题】:Jsoup with big XML带有大 XML 的 Jsoup
【发布时间】: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


【解决方案1】:

您将无法使用 Jsoup 解决此问题,因为 Jsoup 从已解析的 XML 创建了一个完整的 DOM 树,该树在您的内存中变得越来越大。 Jsoup 顺便说一句。首先是作为 HTML 解析器。

我会使用基于事件的 XML 解析器,例如 XMLPullParser

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2011-02-15
    • 2015-02-12
    • 2015-03-14
    相关资源
    最近更新 更多