Jsoup与大XML

时间:2015-09-30 07:10:23

标签: android xml performance xml-parsing jsoup

我在我的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且我的应用程序崩溃了。

1 个答案:

答案 0 :(得分:1)

你将无法用Jsoup解决这个问题,因为Jsoup从解析的XML中创建了一个完整的DOM树,它在你的内存中变得越来越大。 Jsoup btw。首先是一个HTML解析器。

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