0

这个类导致我 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;
}

}
4

2 回答 2

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

execute 方法可以采用(String... params),因此您可以传递例如 URL,并在其中检索它doInBackground(String... params)

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

祝你好运。

于 2012-10-16T15:08:54.490 回答
0

如果您使用AsyncTask确保getFeedsdoInBackground(...)回调中调用

于 2012-10-16T14:31:37.067 回答