android.os.NetworkOnMainThreadException Sax解析

时间:2012-10-16 14:20:41

标签: android rss android-asynctask

这个类导致我android.os.NetworkOnMainThreadException,我知道我必须使用asyncTask来制作它,但我无法弄清楚如何因为我使用1个片段而这使得我的应用程序非常慢,特别是当我提交位图时,任何人都可以帮助我。

public class ContainerData {    

static public Context context;

public ContainerData() {

}


public static ArrayList<Feed> getFeeds(String feedurl){
    SAXParserFactory fabrique = SAXParserFactory.newInstance();
    SAXParser parseur = null;
    ArrayList<Feed> feeds = null;
    try {
        parseur = fabrique.newSAXParser();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    }
    URL url = null;
    try {
        url = new URL(feedurl);
    } catch (MalformedURLException e1) {
        e1.printStackTrace();
    }

    DefaultHandler handler = new ParserXMLHandler();
    try {
        parseur.parse(url.openConnection().getInputStream(), handler);

        feeds = ((ParserXMLHandler) handler).getData();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return feeds;
}

}

2 个答案:

答案 0 :(得分:0)

如果您使用AsyncTask,请确保在getFeeds回调中调用doInBackground(...)

答案 1 :(得分:0)

无论您是否使用片段,您仍尝试在主线程上执行网络活动。

创建一个扩展AsyncTask的泛型类,它可以执行所有解析。

public class MyTaskHandler extends AsyncTask<String, Integer, Boolean>
{

@Override
protected void onPreExecute() 
{
   //Could display progress dialog here
}

@Override
protected Boolean doInBackground(String... params) 
{
   //Implement your parser here
}

@Override
protected void onPostExecute(Boolean result) 
{
   //Check result, dismiss dialog etc
}
}

然后创建MyTaskHandler的新实例并运行它......

MyTaskHandler myTask = new MyTaskHandler();
myTask.execute("http://www.myxmlsite.com/lists.xml");

执行方法可以(String... params),因此您可以传递一个URL,并在doInBackground(String... params)

中检索它
@Override
protected Boolean doInBackground(String... params) 
{
   //Implement your parser here
   String urlToParse = params[0];
}

祝你好运。