与XML解析AsyncTask的速度不如在主线程解析 [英] Xml parsing with AsyncTask slower than parsing in main Thread
问题描述
我有我的code一个奇怪的现象:解析本地XML文件上的模拟器AsyncTask的时间长于分析它的主线程
I'm having a strange behaviour in my code: parsing a local xml file on simulator with asyncTask takes longer than parsing it on main thread.
下面是我的code。与AsyncTask的:
Here is my code with AsyncTask:
public class MostraTutti extends SherlockActivity {
ListView lv;
final List<ListViewItem> items = new ArrayList<MostraTutti.ListViewItem>();
final ArrayList<String> nome = new ArrayList<String>();
final ArrayList<String> immagine = new ArrayList<String>();
...
final int array_image2[] ={R.drawable.iodocloroidrossichinolina,R.drawable.acidoacetilsalicilico,
...};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mostra_tutti);
lv = (ListView) findViewById(R.id.listView);
getSupportActionBar().setDisplayShowHomeEnabled(false);
RssFeedTask rssTask = new RssFeedTask();
rssTask.execute();
}
private class RssFeedTask extends AsyncTask<String, Void, String> {
private ProgressDialog Dialog;
String response = "";
@Override
protected void onPreExecute() {
Dialog = new ProgressDialog(MostraTutti.this);
Dialog.setMessage("Leggo le sostanze...");
Dialog.show();
}
@Override
protected String doInBackground(String... urls) {
InputStream xmlFile = getResources().openRawResource(R.raw.sostanze);
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
final Document document = documentBuilder.parse(xmlFile);
document.getDocumentElement().normalize();
NodeList nodeList = document.getElementsByTagName("sostanza");
for (int i = 0; i < nodeList.getLength(); i++) {
final int indice = i;
nome.add(document.getElementsByTagName("nome").item(indice).getTextContent());
iupac.add(document.getElementsByTagName("iupac").item(indice).getTextContent());
aspetto.add(document.getElementsByTagName("aspetto").item(indice).getTextContent());
formula.add(document.getElementsByTagName("formula").item(indice).getTextContent());
immagine.add(document.getElementsByTagName("immagine").item(indice).getTextContent());
appartenenza.add(document.getElementsByTagName("appartenenza").item(indice).getTextContent());
spiegazione.add(document.getElementsByTagName("spiegazione").item(indice).getTextContent());
tempFus.add(document.getElementsByTagName("temperaturaFusione").item(indice).getTextContent());
tempEboll.add(document.getElementsByTagName("temperaturaEbollizione").item(indice).getTextContent());
solubilita.add(document.getElementsByTagName("solubilita").item(indice).getTextContent());
note.add(document.getElementsByTagName("eccezioni").item(indice).getTextContent());
String str = document.getElementsByTagName("formula").item(indice).getTextContent();
str = str.replaceAll("0", "\u2080");
str = str.replaceAll("1", "\u2081");
str = str.replaceAll("2", "\u2082");
str = str.replaceAll("3", "\u2083");
str = str.replaceAll("4", "\u2084");
str = str.replaceAll("5", "\u2085");
str = str.replaceAll("6", "\u2086");
str = str.replaceAll("7", "\u2087");
str = str.replaceAll("8", "\u2088");
str = str.replaceAll("9", "\u2089");
final String stringa = str;
formulaConvertita.add(stringa);
//CustomListViewAdapter adapter = new CustomListViewAdapter(MostraTutti.this,items);
//lv.setAdapter(adapter);
items.add(new ListViewItem()
{{
ThumbnailResource = array_image2[indice];
Title = document.getElementsByTagName("nome").item(indice).getTextContent();
SubTitle = stringa;
}});
};
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
Dialog.dismiss();
CustomListViewAdapter adapter = new CustomListViewAdapter(MostraTutti.this,items);
lv.setAdapter(adapter);
lv.setOnItemClickListener(
new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
{
Context context = getBaseContext();
Intent myIntent = new Intent(context, Dettagli.class);
myIntent.putExtra("nome_sostanza",nome.get(position));
// myIntent.putExtra("formula",formula.get(position));
myIntent.putExtra("iupac",iupac.get(position));
myIntent.putExtra("aspetto",aspetto.get(position));
myIntent.putExtra("appartenenza",appartenenza.get(position));
myIntent.putExtra("solubilita",solubilita.get(position));
myIntent.putExtra("tempFus",tempFus.get(position));
myIntent.putExtra("tempEboll",tempEboll.get(position));
myIntent.putExtra("spiegazione",spiegazione.get(position));
myIntent.putExtra("immagine", array_image2[position]);
myIntent.putExtra("formulaConvertita", formulaConvertita.get(position));
myIntent.putExtra("note", note.get(position));
startActivityForResult(myIntent, 0);
}
}
);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
class ListViewItem {
public int ThumbnailResource;
public String Title;
public String SubTitle;
}
}
这是我的code,没有AsyncTask的:
And here's my code with no AsyncTask:
public class MostraTutti extends SherlockActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mostra_tutti);
getSupportActionBar().setDisplayShowHomeEnabled(false);
final ListView lv = (ListView) findViewById(R.id.listView);
final List<ListViewItem> items = new ArrayList<MostraTutti.ListViewItem>();
final ArrayList<String> nome = new ArrayList<String>();
final ArrayList<String> immagine = new ArrayList<String>();
...
final int array_image2[] ={R.drawable.iodocloroidrossichinolina,R.drawable.acidoacetilsalicilico,
...};
的InputStream XMLFILE = getResources()openRawResource(R.raw.sostanze);
InputStream xmlFile = getResources().openRawResource(R.raw.sostanze);
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
final Document document = documentBuilder.parse(xmlFile);
document.getDocumentElement().normalize();
//tagHandler.handleChannelTag(document);
NodeList nodeList = document.getElementsByTagName("sostanza");
for (int i = 0; i < nodeList.getLength(); i++) {
final int indice = i;
nome.add(document.getElementsByTagName("nome").item(indice).getTextContent());
iupac.add(document.getElementsByTagName("iupac").item(indice).getTextContent());
aspetto.add(document.getElementsByTagName("aspetto").item(indice).getTextContent());
formula.add(document.getElementsByTagName("formula").item(indice).getTextContent());
immagine.add(document.getElementsByTagName("immagine").item(indice).getTextContent());
appartenenza.add(document.getElementsByTagName("appartenenza").item(indice).getTextContent());
spiegazione.add(document.getElementsByTagName("spiegazione").item(indice).getTextContent());
tempFus.add(document.getElementsByTagName("temperaturaFusione").item(indice).getTextContent());
tempEboll.add(document.getElementsByTagName("temperaturaEbollizione").item(indice).getTextContent());
solubilita.add(document.getElementsByTagName("solubilita").item(indice).getTextContent());
note.add(document.getElementsByTagName("eccezioni").item(indice).getTextContent());
String str = document.getElementsByTagName("formula").item(indice).getTextContent();
str = str.replaceAll("0", "\u2080");
str = str.replaceAll("1", "\u2081");
str = str.replaceAll("2", "\u2082");
str = str.replaceAll("3", "\u2083");
str = str.replaceAll("4", "\u2084");
str = str.replaceAll("5", "\u2085");
str = str.replaceAll("6", "\u2086");
str = str.replaceAll("7", "\u2087");
str = str.replaceAll("8", "\u2088");
str = str.replaceAll("9", "\u2089");
final String stringa = str;
formulaConvertita.add(stringa);
items.add(new ListViewItem()
{{
ThumbnailResource = array_image2[indice];
Title = document.getElementsByTagName("nome").item(indice).getTextContent();
SubTitle = stringa;
}});
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
CustomListViewAdapter adapter = new CustomListViewAdapter(this,items);
lv.setAdapter(adapter);
lv.setOnItemClickListener(
new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
{
Context context = getBaseContext();
Intent myIntent = new Intent(context, Dettagli.class);
myIntent.putExtra("nome_sostanza",nome.get(position));
// myIntent.putExtra("formula",formula.get(position));
myIntent.putExtra("iupac",iupac.get(position));
myIntent.putExtra("aspetto",aspetto.get(position));
myIntent.putExtra("appartenenza",appartenenza.get(position));
myIntent.putExtra("solubilita",solubilita.get(position));
myIntent.putExtra("tempFus",tempFus.get(position));
myIntent.putExtra("tempEboll",tempEboll.get(position));
myIntent.putExtra("spiegazione",spiegazione.get(position));
myIntent.putExtra("immagine", array_image2[position]);
myIntent.putExtra("formulaConvertita", formulaConvertita.get(position));
myIntent.putExtra("note", note.get(position));
startActivityForResult(myIntent, 0);
}
}
);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
class ListViewItem {
public int ThumbnailResource;
public String Title;
public String SubTitle;
}
}
在模拟器所不同的是主线程1个16秒,1分钟的AsyncTask的一个!
The difference on simulator is 16 seconds for the main thread one and 1 minute for the AsyncTask one!
推荐答案
我已将此问题作为一个重复的,但我没有这最后一次,评审投了反对票。
I've marked this question as a duplicate but last time I did this, the reviewers voted against it.
无论哪种方式,原因是的AsyncTask
的 doInBackground()
运行在一个研究背景优先级,并有共享的CPU时间与所有其它后台任务,最多10%,如您的RSS阅读器的等 - 无论系统是多么的空闲是
Either way, the reason is that AsyncTask
's doInBackground()
runs in a backgroud priority class and has to share at most 10% of CPU time with all other background tasks, such as your RSS reader's etc -- no matter how idle the system really is.
这篇关于与XML解析AsyncTask的速度不如在主线程解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!