2017-03-11 8 views
0

このコースでは、アプリケーション "ニュースリーダー"を作成しています。基本的には、APIからニュースのIDを取得する必要があります(最初のAsyncTask呼び出し)。その後、これらのIDを使用して、すべてのニュース記事(Second Async呼び出し)のデータを取得し、そのデータにはその記事。 URLを取得するとDBに格納され、後で使用されます。それはJava AsyncTaskの使用

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

で行われました は当然で、onPostExecute()は使用されなかった、と私はそれを使用したいです。

だから、ここで私が得たデータをループする際、記事のIDの(第非同期コール)onPostExecute()インサイド

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(); 
     } 
    } 
} 

を取得するクラスがあり、私はすべての非同期呼び出しを行う必要がありID私はそのデータを取得します。

AsyncTaskを使用する別のクラスを作成せずに行う方法はありますか?

+3

あなたは 'AsyncTask'の' doInBackground() 'ですべてをやってみませんか? 'onPostExecute()'でJSONを解析する必要があるとは何も言いません。 –

+0

それは単純でした。ありがとう、時にはソリューションがとても簡単なので、私はそれらを監督します。 –

+1

RxJavaの優れたユースケースのように聞こえます –

答えて

1

onPostExecuteの代わりにdoInBackground()のデータを解析します。 JSONレスポンスからデータを解析して抽出したら、次のAPIを呼び出して、同じdoInBackground()メソッドでもその応答を解析します。

追記

常に別のコンテキストを維持するために、物事を混在させないでくださいお勧めします。モジュール性は、追加の機能でコードを拡張する際に役立ちます。専用classの作成には害はありません。extendsAsyncTaskです。コードを読みやすくし、後で理解できるように清潔に保ちます。

関連する問題