2017-03-11 4 views
0

In diesem Kurs erstelle ich eine Anwendung "News Reader". Grundsätzlich brauche ich IDs der Nachrichten von einer API (First AsyncTask Anruf), dann benutze ich diese IDs, ich bekomme die Daten für jeden Nachrichtenartikel (Second Async-Aufruf), und in diesen Daten gibt es eine URL, die zu führt dieser Artikel. Wenn ich die URL bekomme, speichere ich sie in einer DB und es wird später verwendet. Im Verlauf wurde es mitVerwendung von Java AsyncTask

getan
getNews news = new getNews(); 
String result = news.execute("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty").get(); 

wurde die onPostExecute() nicht verwendet wird, und ich will, es zu benutzen.

So, hier ist die Klasse, die die IDs des Artikels (Erster Async Anrufs)

public class getNews extends AsyncTask<String, Void, String>{ 

    @Override 
    protected String doInBackground(String... params) { 
     URL url; 
     String result = ""; 
     HttpURLConnection connection = null; 
     try { 
      url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      InputStream in = connection.getInputStream(); 
      InputStreamReader reader = new InputStreamReader(in); 
      int data = reader.read(); 
      while(data != -1){ 
       char current = (char) data; 
       result += current; 
       data = reader.read(); 
      } 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     try { 
      JSONArray jsonArray = new JSONArray(s); 
      //System.out.println("asasd" + jsonArray); 
      for(int i = 0; i< 20; i++){ 


      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Innerhalb der onPostExecute(), wenn Schleife durch die Daten bekommt ich habe, habe ich einen Async Anruf zu jedem machen ID Ich bekomme diese Daten.

Also gibt es eine Möglichkeit, es zu tun, ohne eine andere Klasse zu erstellen, die AsyncTask verwendet?

+3

Warum machst du nicht einfach alles in 'AsyncTask's' doInBackground() '? Nichts sagt, dass Sie den JSON in 'onPostExecute()' analysieren müssen. –

+0

Nun, das war einfach. Danke, manchmal sind die Lösungen so einfach, dass ich sie beaufsichtige. –

+1

Klingt wie ein ausgezeichneter Anwendungsfall für RxJava –

Antwort

1

Analysieren Sie Ihre Daten in doInBackground() anstelle von onPostExecute Methode. Nachdem Sie mit dem Analysieren und Extrahieren von Daten aus der JSON-Antwort fertig sind, rufen Sie die nächste API auf und analysieren Sie ihre Antwort auch in derselben Methode doInBackground().

Nebenbei bemerkt

Es ist immer Kontext getrennt zu halten wird empfohlen, und die Dinge nicht vermischen. Modularität hilft bei der Erweiterung Ihres Codes mit zusätzlichen Funktionen. Es gibt keinen Schaden bei der Erstellung dedizierten class, die extendsAsyncTask. Hält den Code für die spätere Lesbarkeit und Verständlichkeit sauber.