Я использую Jsoup в своем приложении для Android, чтобы прочитать xml-файл, чтобы получить поддержку webservice.Jsoup с большим XML
Библиотека Jsoup отлично работает, пока файл xml не содержит нескольких записей.
Но когда я получаю xml с 50k или 60k записей, я заметил, что Jsoup выделяет память до 230MB 240MB. Это проблема, потому что с
android:largeHeap="true"
У меня есть 256 МБ памяти.
Это код 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>
Возьмите строку метки и не копировать + вставить его, пока вы имеют 60 тысяч записей в вашем примере XML. Поместите его туда, где вы хотите, при условии, что его можно достичь с помощью http-вызова (URL). Скопируйте URL-адрес в код
Jsoup.connect("COPY URL OF XML HERE")
И вы можете видеть, что я имею в виду.
Мне нужно решение для решения этой проблемы с распределением, потому что иногда не всегда выделение достигает 256 МБ, а мое приложение падает.
поэтому используйте синтаксические анализаторы «sax» или «pull» – pskink