2013-11-27 15 views
6

JSON URL'sinden veri alan bir uygulama var. Bir URL ile mükemmel şekilde çalışır, ancak iki JSON URL'sinden aynı anda veri almam gerekir. Bir URL’den ve diğerlerinden bazılarına benzer. Ve bunları iki textViews içinde göster.AsyncTask yöntemiyle 2 farklı URL'den veri ayrıştırma

İşte benim uygulamam, şu anda herhangi bir veri yüklemiyor.

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" 
     /> 

Ben asıl sorun new GetJSONTask().execute(url1); veolduğunu düşünüyorum 10 2 GetJSONTASK'ım olmadığı için aynı zamanda json1 ve json2'ye geri dönemez.

Herhangi bir fikrin var mı?

cevap

5

Sana

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 
} 
} 

umut bu yardımı için yöntemini değiştirmek için önermek!

+0

Mükemmel. Teşekkür ederim. – Alex

0

Varyant A) Böyle senin GetJSONTask yürütebilir: İsterseniz

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) { ... } 

} 

Varyant B):

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

Ve bu gibi AsyncTask URL'leri erişmek İşlemi gerçekten paralel hale getirin, 2 çocuk görevi oluşturan başka bir AsyncTask ekleyebilir ve sonuçları için bekler. Çoğu cihazda, bu görevi gerçekleştirmek için gereken sürenin yarısı kadar olacaktır.

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

Yardımlarınız için teşekkürler. Ama bir problem var. Bu gibi hatalar yeni bir JSONObject [] {json1, json2}; gibi döndürür ve bu sebeptir: _Type uyumsuzluğu: JSONObject [] 'den JSONObject_ – Alex

+0

'a dönüştürülemez. Genel AsyncTask'da doğru türü sağlamanız gerekir: 'GetJSONTask genişletir AsyncTask ' – sulai