2016-06-13 9 views
2

Ich habe eine Android-Anwendung, in der ich einfach Text aus einem RSS-Feed in einer Listenansicht anzeigen möchte. Die Anwendung ruft den Feed nur ab, wenn ich ihn im Debug-Modus mit Haltepunkten in bestimmten Zeilen der Hauptaktivität ausführe.Asynchrone Task nur Daten im Debug-Modus (Android) abrufen

Ich erhalte den Feed asynchron, dies könnte einer der Gründe sein, warum dies passiert, aber ich bin mir nicht sicher, wie ich den Feed sofort anzeigen kann, wenn ich die App ohne den Debugger starte. Hier

ist die Haupttätigkeit:

public class MainActivity extends ListActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ArrayList<String> headlines = new ArrayList<>(); 
    RetrieveFeed getXML = new RetrieveFeed(); 

    getXML.execute(); 

    headlines = getXML.heads(); 

    // Binding data 
    ArrayAdapter adapter = new ArrayAdapter(this, 
      android.R.layout.simple_list_item_1, headlines); 

    setListAdapter(adapter); 

}} 

Hier ist die Klasse, die den Hintergrund Abruf im Hintergrund tut:

public class RetrieveFeed extends AsyncTask { 

URL url; 
ArrayList<String> headlines = new ArrayList(); 
ArrayList<String> links = new ArrayList(); 


@Override 
protected Object doInBackground(Object[] params) { 

    try { 
     //does specific stuff here :) 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return headlines; 
} 

private InputStream getInputStream(URL url) { 
    try { 
     return url.openConnection().getInputStream(); 
    } catch (IOException e) { 
     return null; 
    } 
} 

public ArrayList<String> heads() 
{ 
    return headlines; 
}} 

Antwort

3

Das Problem ist, sind Sie zugreifen möchten Die Daten vor Ihrer AsyncTask endet.

getXML.execute(); 
headlines = getXML.heads(); 
// you execute your AsyncTask here and try to access it's data 
// immediately, without waiting for it to finish execution 

Um dies zu beheben, müssen Sie onPostExecute() in Ihrem AsyncTask, außer Kraft zu setzen (was nach doInBackground() beendet aufgerufen wird) und bevölkern/aktualisieren Sie Ihren ListView von dort.

Sie könnten entweder RetrieveFeed eine innere Klasse MainActivity machen, so dass Sie direkten Zugriff auf Ihre ListView haben, oder Callback-Mechanismus über eine Schnittstelle implementieren.

Wenn Sie Letzteres wählen, sehen Sie sich this answer als Beispiel an.

Um während der Ausführung einen ProgressDialog anzuzeigen, sollten Sie auch onPreExecute() überschreiben. Zeigen Sie Ihren Dialog von dort und entlassen Sie ihn in onPostExecute().

Überprüfen Sie this answer für ein Beispiel.

+0

Vielen Dank! – HaroldHibari