2012-04-22 34 views
0

我想从本网站获取所有货币汇率并在我的应用程序中处理它。 这是网站:https://raw.github.com/currencybot/open-exchange-rates/master/latest.json按照顺序下载带有JSON的Web页面?

我使用这个类来获得所有的货币汇率,但问题是,它得到它,因为迭代器键= ratesObj.key的随机顺序();

我该如何解决这个问题,以便它获得所有的汇率?

这是代码:

private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<Double>> 
{ 
    protected ArrayList<Double> doInBackground(String... urls) 
    { 
     ArrayList<Double> response = new ArrayList<Double>(); 
     for (String url : urls) 
     { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 
       InputStreamReader isr = new InputStreamReader(content); 
       StringBuilder sb = new StringBuilder(); 
       char[] buffer = new char[1024]; 
       while (isr.read(buffer) != -1) 
       { 
        sb.append(buffer); 
       } 
       JSONObject jobj = new JSONObject(sb.toString()); 
       JSONObject ratesObj = jobj.getJSONObject("rates"); 
       Iterator<String> keys = ratesObj.keys(); 
       while (keys.hasNext()) 
       { 
        response.add(Double.parseDouble(ratesObj.getString(keys.next()))); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
    @Override 
    protected void onPostExecute(ArrayList<Double> result) 
    { 
     currency_values = result; 
    } 
} 

谢谢大家的帮助!对此,我真的非常感激。

UPDATE:这是现在的代码。

try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 
       String s = EntityUtils.toString(execute.getEntity()); 
       JSONObject jobj = new JSONObject(s); 
       JSONObject ratesObj = jobj.getJSONObject("rates"); 
       Iterator<String> keys = ratesObj.keys(); 
       while (keys.hasNext()) 
       { 
        response.add(Double.parseDouble(ratesObj.getString(keys.next()))); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
+0

别当存在服从服务器设置的内容编码的EntityUtils.toString(execute.getEntity())时,使用'InputStreamReader'和'StringBuilder'代码少得多,并且具有适当的错误处理。 – 2012-04-22 18:47:25

+0

然后这会改变它下面的循环。那么我将如何修复循环呢? – sameetandpotatoes 2012-04-22 18:49:49

+0

如果你的意思是'while(isr.read(buffer)!= -1)'循环,它不会被改变 - 你会完全删除它,因为如果你使用EntityUtils.toString() 。 – 2012-04-22 18:51:28

回答

1

这里实现我的意见建议,使用SortedMap<String, Double>,同时保持它按字母顺序货币代码订购的三个字母组成的货币代码汇率映射的一种方法:

protected SortedMap<String, Double> doInBackground(String... urls) { 
    SortedMap<String, Double> result = new TreeMap<String, Double>(); 

    HttpClient client = new DefaultHttpClient(); 
    for (String url : urls) { 
     try { 
     HttpGet request = new HttpGet(url); 
     HttpResponse response = client.execute(request); 
     String jsonString = EntityUtils.toString(response.getEntity()); 

     JSONObject json = new JSONObject(jsonString); 
     JSONObject rates = json.getJSONObject("rates"); 
     Iterator<String> currencyCodes = rates.keys(); 
     while (currencyCodes.hasNext()) { 
      String currencyCode = currencyCodes.next(); 
      double rate = rates.getDouble(currencyCode); 
      result.put(currencyCode, rate); 
     } 
     } catch (Exception ex) { 
     Log.e(TAG, "Failed to download exchange rates from " + url, ex); 
     } 
    } 
    return result; 
    } 
+0

是的,它确实有效。非常感谢你帮助像我这样的年轻程序员。我很感激! – sameetandpotatoes 2012-04-22 19:46:14