Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
139 views
in Technique[技术] by (71.8m points)

android.os.NetworkOnMainThreadException Manifest

In the below code I got an error when running my android project for RssReader.

My main file:

public class Earthquake extends Activity {
    ListView earthquakeListView;
    ArrayAdapter < Quake > aa;
    ArrayList < Quake > earthquakes = new ArrayList < Quake > ()
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        earthquakeListView = (ListView) this.findViewById(R.id.earthquakeListView);
        int layoutID = android.R.layout.simple_list_item_1;
        aa = new ArrayAdapter < Quake > (this, layoutID, earthquakes);
        earthquakeListView.setAdapter(aa);
        refreshEarthquakes();
    }
    private void refreshEarthquakes() {
        //get the XML
        URL url;
        try {
            String quakeFeed = getString(R.string.quake_feed);
            url = new URL(quakeFeed);
            URLConnection connection;
            connection = url.openConnection();
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            int responseCode = httpConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                InputStream in = httpConnection.getInputStream();
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                //Parse the earthquake feed
                Document dom = db.parse( in );
                Element docEle = dom.getDocumentElement();
                //Clear the old earthquakes
                earthquakes.clear();
                //Get a list of each earthquake entry
                NodeList nl = docEle.getElementsByTagName("entry");
                if (nl != null && nl.getLength() > 0) {
                    for (int i = 0; i < nl.getLength(); i++) {
                        Element entry = (Element) nl.item(i);
                        Element title = (Element) entry.getElementsByTagName("title").item(0);
                        Element g = (Element) entry.getElementsByTagName("georss:point").item(0);
                        Element when = (Element) entry.getElementsByTagName("updated").item(0);
                        Element link = (Element) entry.getElementsByTagName("link").item(0);
                        String details = title.getFirstChild().getNodeValue();
                        String hostname = "http://earthquake.usgs.gov";
                        String linkString = hostname + link.getAttribute("href");
                        String point = g.getFirstChild().getNodeValue();
                        String dt = when.getFirstChild().getNodeValue();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
                        Date qdate = new GregorianCalendar(0, 0, 0).getTime();
                        try {
                            qdate = sdf.parse(dt);
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        String[] location = point.split(" ");
                        Location l = new Location("dummyGPS");
                        l.setLatitude(Double.parseDouble(location[0]));
                        l.setLongitude(Double.parseDouble(location[1]));
                        String magnitudeString = details.split(" ")[1];
                        int end = magnitudeString.length() - 1;
                        double magnitude = Double.parseDouble(magnitudeString.substring(0, end));
                        details = details.split(",")[1].trim();
                        Quake quake = new Quake(qdate, details, l, magnitude, linkString);
                        //Process a newly found earthquake
                        addNewQuake(quake);
                    }
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } finally {}
    }
    private void addNewQuake(Quake _quake) {
        //Add the new quake to our list of earthquakes
        earthquakes.add(_quake);
        //Notify the array adapter of a change
        aa.notifyDataSetChanged();
    }
}

Second file:

public class Quake {
    private Date date;
    private String details;
    private Location location;
    private double magnitude;
    private String link;
    public Date getDate() {
        return date;
    }
    public String getDetails() {
        return details;
    }
    public Location getLocation() {
        return location;
    }
    public double getMagnitude() {
        return magnitude;
    }
    public String getLink() {
        return link;
    }
    public Quake(Date _d, String _det, Location _loc, double _mag, String _link) {
        date = _d;
        details = _det;
        location = _loc;
        magnitude = _mag;
        link = _link;
    }
    @Override
    public String toString() {
        SimpleDateFormat sdf = new SimpleDateFormat("HH.mm");
        String dateString = sdf.format(date);
        return dateString + ": " + magnitude + " " + details;
    }
}

I have read many articles with this and I have tried to add AsyncTask but it doesn't work. Also I have tried to add this:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

But this error comes up:

android.os.NetworkOnMainThreadException

How can I fix this issue?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This exception is thrown when an application attempts to perform a networking operation on its main thread. Run your code in AsyncTask.

see : http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...