2013-11-27 8 views
6

Ho un app che ottiene i dati da un URL JSON. Funziona perfettamente con un URL, ma ho bisogno di ottenere i dati da due URL JSON allo stesso tempo. Come alcuni dati da un URL e alcuni dall'altro. E mostrali in due textView.Come analizzare i dati provenienti da 2 diversi URL con il metodo AsyncTask

Ecco la mia app, ma non carica tutti i dati attualmente.

MainActivity:

public class MainActivity extends Activity { 

//URL to get JSON Array 
private static String url1 = "http://api.worldbank.org/countries/de?format=json"; 
private static String url2 = "http://api.worldbank.org/countries/it?format=json"; 

//JSON Node Names 
private static final String CountryNAME1 = "name"; 
private static final String CountryNAME2 = "name"; 
JSONArray user = null; 

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

    new GetJSONTask().execute(url1); 
    //new GETJSONTask().execute(url2); 
} 
class GetJSONTask extends AsyncTask<String, Void, JSONObject> { 


    protected JSONObject doInBackground(String... urls) { 
     // Creating new JSON Parser 
     JSONParser jParser = new JSONParser(); 

     // Getting JSON from URL 
     JSONObject json1 = jParser.getJSONFromUrl(url1); 
     JSONObject json2 = jParser.getJSONFromUrl(url2); 

     return json1; 
    } 
    protected void onPostExecute(JSONObject json1, JSONObject json2) { 
     //Getting JSON Array 
     try { 

      //For Country 1 
      // Get the array 
      JSONArray countryArC1 = json1.getJSONArray("myValues"); 
      JSONObject countryObC1 = countryArC1.getJSONObject(0); 

      JSONArray countryAr2C1 = countryArC1.getJSONArray(1); 
      JSONObject countryOb2C1 = countryAr2C1.getJSONObject(0); 

      //For Country 2 
     // Get the array 
      JSONArray countryArC2 = json2.getJSONArray("myValues"); 
      JSONObject countryObC2 = countryArC2.getJSONObject(0); 

      JSONArray countryAr2C2 = countryArC2.getJSONArray(1); 
      JSONObject countryOb2C2 = countryAr2C2.getJSONObject(0); 




      //Storing JSON item in a Variable 
      String name1 = countryOb2C1.getString(CountryNAME1); 
      String name2 = countryOb2C2.getString(CountryNAME2); 

      //Importing TextView 
      final TextView textView1 = (TextView)findViewById(R.id.url1); 
      final TextView textView2 = (TextView)findViewById(R.id.url2); 

      //Set JSON Data in TextView 
      textView1.setText(name1); 
      textView2.setText(name2); 

     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

} 

JSONParser:

public class JSONParser { 
static InputStream is = null; 
static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

public JSONObject getJSONFromUrl(String url) { 

    //System.out.println("url getJSONfromUrl " + url); 
    //url = "http://api.worldbank.org/countries/CA/indicators/SP.POP.TOTL?date=1980:1981&format=json"; 

    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 

     HttpResponse httpResponse = httpClient.execute(httpGet); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     is = httpEntity.getContent();   

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
     System.out.println("JSONParser string: " + json); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 


    if (json.startsWith("[")) { 
     // We have a JSONArray 
     try { 
      jObj = new JSONObject(); 
      jObj.put("data", new JSONArray(json)); 
     } catch (JSONException e) { 
      Log.d("JSON Parser", "Error parsing JSONArray " + e.toString()); 
     } 
     return jObj; 
    } 

// try parse the string to a JSON object 
    /*try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    }*/ 

    // return JSON String 
    return jObj; 



} 
} 

XML:

<TextView 
     android:id="@+id/url1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

    <TextView 
     android:id="@+id/url2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/url1" 
     android:layout_marginTop="104dp" 
     /> 

Credo che il problema principale è new GetJSONTask().execute(url1); e JSONObject json1 = jParser.getJSONFromUrl(url1); Dato che non posso avere 2 GetJSONTASK e anche non posso restituire json1 e json2 allo stesso tempo.

Qualche idea?

risposta

5

suggerisco di cambiare il metodo di

class GetJSONTask extends AsyncTask<String, Void, JSONObject[]> { 

... 

protected JSONObject[] doInBackground(String... urls) { 
    // Creating new JSON Parser 
    JSONParser jParser = new JSONParser(); 

    // Getting JSON from URL 
    JSONObject[] jsons = new JSONObject[2]; 
    jsons[0] = jParser.getJSONFromUrl(url1); 
    jsons[1] = jParser.getJSONFromUrl(url2); 

    return jsons; 
} 
protected void onPostExecute(JSONObject[] jsons) { 
    JSONObject json1 = jsons[0]; 
    JSONObject json2 = jsons[1]; 
    // do you work after this 
} 
} 

speranza questo aiuto!

+0

Perfetto. Grazie. – Alex

0

Variante A) Si potrebbe eseguire il GetJSONTask in questo modo:

new GetJSONTask().execute(url1, url2); 

e accedere alla URL della tua AsyncTask come questo:

class GetJSONTask extends AsyncTask<String, Void, JSONObject[]> { 
    ... 
    JSONObject[] doInBackground(String... urls) { 

     // Getting JSON from URL 
     JSONObject json1 = jParser.getJSONFromUrl(urls[1]); 
     JSONObject json2 = jParser.getJSONFromUrl(url2[2]); 

     return new JSONObject[] {json1, json2}; 
    } 

    void onPostExecute(JSONObject[] jsons) { ... } 

} 

Variante B) Se si desidera rendere il processo veramente parallelo, è possibile aggiungere un altro AsyncTask che crea 2 attività figlio e attende il loro risultato. Sulla maggior parte dei dispositivi, questa metà del tempo richiesto per eseguire tale attività.

class GetTwoJsonsTask extends AsyncTask<String, Void, JSONObject[]> { 
    JSONObject[] doInBackground(urls) { 

     task1 = new GetJSONTask().execute(urls[1]); 
     task2 = new GetJSONTask().execute(urls[2]); 

     // block until sub-tasks are finished 
     JSONObject json1 = task1.get(); 
     JSONObject json2 = task2.get(); 

     return new JSONObject[] {json1, json2}; 
    } 

    void onPostExecute(JSONObject[] jsons) { ... } 

} 
+0

Grazie per il vostro aiuto. Ma c'è un problema. E 'errori in questo come 'ritornare nuova JSONObject [] {json1, json2};' e questa è la ragione: _Type mancata corrispondenza: non può convertire da JSONObject [] per JSONObject_ – Alex

+0

È necessario fornire il tipo corretto nel AsyncTask generico: 'GetJSONTask estende AsyncTask ' – sulai

Problemi correlati