如何使用AsyncTask的使用XML SAX解析器? [英] How to use AsyncTask with xml Sax Parser?

查看:106
本文介绍了如何使用AsyncTask的使用XML SAX解析器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的XML SAX解析器读取网页XML和它的工作范围内的Andr​​oid 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆