gpt4 book ai didi

android - 如何将 AsyncTask 与 xml Sax Parser 一起使用?

转载 作者:行者123 更新时间:2023-11-29 00:43:22 27 4
gpt4 key购买 nike

我使用 xml sax 解析器从 web 读取 xml,它在 android 2.3 中工作。但是现在我想让它在 Android 3.0 上工作。因为我在主线程中读取文件,所以出现错误:

android.os.NetworkOnMainThreadException

我尝试使用 AsyncTask,但无法正常工作。请告诉我如何在我的案例中实现 AsyncTask。这是我的原始代码:

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);
}

最佳答案

你实际上应该使用 AsyncTaskLoader在这种情况下。它会让事情变得更容易。只需创建您自己的扩展 AsyncTaskLoader 的类,并使其具有一个方法 loadInBackground()。在您的 loadInBackground() 方法中,放入您用来解析 xml 的代码,如下所示:

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;
}

然后,在显示列表的 Activity 中,让 Activity 实现 LoaderManager.LoaderCallbacks界面,像这样

public YourActivity implements LoaderManager.LoaderCallbacks<List<String>>

然后实现回调方法。例如,您的 onLoadFinished() 方法看起来就像这样:

public void onLoadFinished(Loader<List<String>>, List<String> data){
aa.setData(data);
}

有关装载机的更多信息,请查看 this documentation .请注意,如果您的目标 API 低于 3.0,则需要使用 Android Support Package .

关于android - 如何将 AsyncTask 与 xml Sax Parser 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com