2016-06-10 2 views
0

ich, dass Netzwerk-Aufgaben verstehen in einem Async-Thread getan werden sollte, und ich denke, mein Code in einem ist, aber ich habe immer noch den FehlerMit Async für eine Netzwerkaktivität

.MainActivity}: android.os.NetworkOnMainThreadException

, die mich verwirrt, da so ziemlich alles in einer Async Aufgabe ist:

public void onStart() { 
     super.onStart(); 
     new GetRssFeedTask().execute(); 
    } 

der Rest des Codes innerhalb der Async Aufgabe ist:

private class GetRssFeedTask extends AsyncTask<Void, Void, List<String>> { 
     private String getRssFeed() throws IOException { 
      InputStream in = null; 
      String rssFeed = null; 
      try { 
       URL url = new URL("http://stuffilikenet.wordpress.com/feed/main.xml"); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       in = conn.getInputStream(); 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       byte[] buffer = new byte[1024]; 
       for (int count; (count = in.read(buffer)) != -1;) { 
        out.write(buffer, 0, count); 
       } 
       byte[] response = out.toByteArray(); 
       rssFeed = new String(response, "UTF-8"); 
      } finally { 
       if (in != null) { 
        in.close(); 
       } 
      } 
      return rssFeed; 
     }  

    ...rest of code (seriously)... 
    } 

Wo soll ich nach meinem Fehler suchen?

+0

ausführen Post ' doInBackground() 'Methode. –

+1

Ihr Code sollte in der DoInBackground() nicht nur eine Methode sein, die Sie erstellen – tyczj

Antwort

2

Netzwerkaufgaben sollten in einem doInBackground() durchgeführt werden.

DoInBackground() Callback-Methode läuft in einem Pool von Hintergrund Threads. Um Ihre Benutzeroberfläche zu aktualisieren, sollten Sie onPostExecute(), implementieren, das das Ergebnis von doInBackground() liefert und im Thread der Benutzeroberfläche ausgeführt wird, sodass Sie Ihre Benutzeroberfläche sicher aktualisieren können.

  • führen initilization in OnPreExecute() -Methode
  • Hintergrundaufgabe in doInBackground() -Methode
  • Update der Benutzeroberfläche in OnPostExecute() -Methode

    public class MyAyncTask extends AsyncTask<Void, Void, Void> { 
    
    @Override 
    protected void onPreExecute() { 
        //Here you can show progress bar or something on the similar lines. 
        //Since you are in a UI thread here. 
        super.onPreExecute(); 
    } 
    
    @Override 
    protected Void doInBackground(Void... params) { 
        // Here you are in the worker thread and you are not allowed to access UI thread from here 
        //Here you can perform network operations or any heavy operations you want. 
        return null; 
    } 
    
    @Override 
    protected void onPostExecute(Void aVoid) { 
        super.onPostExecute(aVoid); 
        //After completing execution of given task , control will return here. 
        //Hence if you want to populate UI elements with fetched data, do it here 
    } 
    
    @Override 
    protected void onProgressUpdate(Void... values) { 
        super.onProgressUpdate(values); 
        // You can track you progress update here 
    } 
    
    } 
    
2

Es ist nicht genug, die Netzwerkoperationen innerhalb Ihrer AsyncTask Klasse zu definieren, um sie auf einem Hintergrund Thread auszuführen.

Sie müssen sie innerhalb doInBackgrund() ausführen.

Sie müssen doInBackground() innerhalb Ihrer AsyncTask Klasse überschreiben und führen Sie Ihre Netzwerkvorgänge dort.

@Override 
protected Void doInBackground(Void... params) { 
    // here 
    return null; 
}