如何使用AsyncTask的使用XML SAX解析器? [英] How to use AsyncTask with xml Sax Parser?
问题描述
我使用的XML SAX解析器读取网页XML和它的工作范围内的Android 2.3。 但现在我希望它在Android 3.0工作。 是因为我在主线程文件出现错误:
android.os.NetworkOnMainThreadException
我试图用AsyncTask的,但我不能使它工作。 请告诉我如何在我的情况下实现的AsyncTask。这是我原来的code:
的ListView LW =(ListView控件)findViewById(R.id.listView1);
最后的ArrayList<字符串>名单=新的ArrayList<字符串>();
最后ArrayAdapter<字符串> AA =新的ArrayAdapter<字符串>(这一点,android.R.layout.simple_list_item_1,清单);
lw.setAdapter(AA);
尝试 {
/ *创建我们希望加载某些XML数据的URL。 * /
网址URL =新的URL(http://www.bnr.ro/nbrfxrates.xml);
//交锋验证链接
的URI的uri =新的URI(url.toString());
HTTPGET HTTPGET =新HTTPGET(URI);
DefaultHttpClient的HttpClient =新DefaultHttpClient();
HTT presponse响应= httpclient.execute(HTTPGET);
如果(response.getStatusLine()的getStatus code()== 200){
URL =新的URL(http://www.visual-efx.net/nbrfxrates.xml);
}
//交锋验证链接
/ *获取从一个SAXParserFactory的SAXParser的。 * /
的SAXParserFactory SPF = SAXParserFactory.newInstance();
的SAXParser藻= spf.newSAXParser();
/ *获取我们创建的SAXParser的XMLReader的。 * /
XMLReader的XR = sp.getXMLReader();
/ *创建一个新的ContentHandler,并将其应用到XML阅读器* /
ExampleHandler myExampleHandler =新ExampleHandler();
xr.setContentHandler(myExampleHandler);
/ *从我们的网址解析XML数据。 * /
xr.parse(新的InputSource(url.openStream()));
/ *解析完成。 * /
的for(int i = 1; I< = 31;我++){
list.add(myExampleHandler.valuta [我] +=+ myExampleHandler preT [我] +林雷);
aa.notifyDataSetChanged();
}
}赶上(例外五){
/ *显示任何错误的图形用户界面。 * /
Log.e(MY_DEBUG_TAG,错误,E);
}
您应该实际上使用的在这种情况下AsyncTaskLoader 。这会让事情变得更容易。只要创建自己的类扩展AsyncTaskLoader,只是有它有一个单一的方法, loadInBackground()
。在你的 loadInBackground()
的方法,把你用它来解析这样的XML中的code:
公开名单<字符串> loadInBackground(){
ArrayList的toReturn =新的ArrayList<字符串>();
尝试 {
网址URL =新的URL(http://www.bnr.ro/nbrfxrates.xml);
的URI的uri =新的URI(url.toString());
HTTPGET HTTPGET =新HTTPGET(URI);
DefaultHttpClient的HttpClient =新DefaultHttpClient();
HTT presponse响应= httpclient.execute(HTTPGET);
如果(response.getStatusLine()的getStatus code()== 200){
URL =新的URL(http://www.visual-efx.net/nbrfxrates.xml)
}
的SAXParserFactory SPF = SAXParserFactory.newInstance();
的SAXParser藻= spf.newSAXParser();
XMLReader的XR = sp.getXMLReader();
ExampleHandler myExampleHandler =新ExampleHandler();
xr.setContentHandler(myExampleHandler);
xr.parse(新的InputSource(url.openStream()));
的for(int i = 1; I< = 31;我++){
toReturn.add(myExampleHandler.valuta [我] +=+ myExampleHandler preT [我] +林雷);
}
}赶上(例外五){
Log.e(MY_DEBUG_TAG,错误,E);
}
返回toReturn;
}
然后,在你显示列表中的活动,让您的活动实施的 LoaderManager.LoaderCallbacks 接口,这样
公共YourActivity实现LoaderManager.LoaderCallbacks<列表<字符串>>
然后实现回调方法。例如,你的 onLoadFinished()
方法看起来简单的是这样的:
公共无效onLoadFinished(装载机<列表<字符串>>中名单,其中,字符串>数据){
aa.setData(数据);
}
有关装载机的更多信息,结账此文档。请注意,如果您的目标的API小于3.0则需要使用href="http://developer.android.com/sdk/compatibility-library.html" rel="nofollow">支持Android的。
I used xml sax parser to read xml from web and it works within android 2.3. But now I want it to work on Android 3.0 to. Because I read the file in the main thread I get the error:
android.os.NetworkOnMainThreadException
I tried to use AsyncTask but I could not make it to work. Please tell me how to implement AsyncTask in my case. Here is my original code:
ListView lw = (ListView)findViewById(R.id.listView1);
final ArrayList<String> list = new ArrayList<String>();
final ArrayAdapter<String> aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
lw.setAdapter(aa);
try {
/* Create a URL we want to load some xml-data from. */
URL url = new URL("http://www.bnr.ro/nbrfxrates.xml");
//aded to verify link
URI uri = new URI(url.toString());
HttpGet httpget = new HttpGet(uri);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode()==200) {
url = new URL("http://www.visual-efx.net/nbrfxrates.xml");
}
//aded to verify link
/* Get a SAXParser from the SAXPArserFactory. */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
/* Get the XMLReader of the SAXParser we created. */
XMLReader xr = sp.getXMLReader();
/* Create a new ContentHandler and apply it to the XML-Reader*/
ExampleHandler myExampleHandler = new ExampleHandler();
xr.setContentHandler(myExampleHandler);
/* Parse the xml-data from our URL. */
xr.parse(new InputSource(url.openStream()));
/* Parsing has finished. */
for (int i=1; i<=31; i++){
list.add(myExampleHandler.valuta[i] + " = " + myExampleHandler.pret[i] + " lei");
aa.notifyDataSetChanged();
}
} catch (Exception e) {
/* Display any Error to the GUI. */
Log.e(MY_DEBUG_TAG, "Error", e);
}
You should actually use an AsyncTaskLoader in this case. It'll make things easier. Just create your own class that extends AsyncTaskLoader and just have it have a single method, loadInBackground()
. In your loadInBackground()
method, put the code that you use to parse the xml like this:
public List<String> loadInBackground(){
ArrayList toReturn = new ArrayList<String>();
try {
URL url = new URL("http://www.bnr.ro/nbrfxrates.xml");
URI uri = new URI(url.toString());
HttpGet httpget = new HttpGet(uri);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode()==200) {
url = new URL("http://www.visual-efx.net/nbrfxrates.xml")
}
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
ExampleHandler myExampleHandler = new ExampleHandler();
xr.setContentHandler(myExampleHandler);
xr.parse(new InputSource(url.openStream()));
for (int i=1; i<=31; i++){
toReturn.add(myExampleHandler.valuta[i] + " = " + myExampleHandler.pret[i] + " lei");
}
} catch (Exception e) {
Log.e(MY_DEBUG_TAG, "Error", e);
}
return toReturn;
}
Then, in the activity where you're displaying the list, have your Activity implement the LoaderManager.LoaderCallbacks interface, like this
public YourActivity implements LoaderManager.LoaderCallbacks<List<String>>
Then implement the callback methods. For instance, your onLoadFinished()
method would look simply like this:
public void onLoadFinished(Loader<List<String>>, List<String> data){
aa.setData(data);
}
For more information on loaders, checkout this documentation. Note that if you're targeting an API less than 3.0 you'll need to use the Android Support Package.
这篇关于如何使用AsyncTask的使用XML SAX解析器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!