2012-03-29 4 views
0

Я работаю над разбором веб-сайта в своем приложении.AsyncTask в Android?

Это сайт: https://raw.github.com/currencybot/open-exchange-rates/master/latest.json

Так как у меня были некоторые проблемы с этим, я первый пытался получить весь сайт, используя класс, который расширяет AsyncTask.

Вот код, который получает все из вышеприведенного сайта:

 private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 
     String response = ""; 
     for (String url : urls) 
     { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
} 

Однако, если вы идете на сайт, я хочу только часть после ставки. Мне нужно отредактировать приведенный выше код, чтобы он возвращал только то, что мне нужно.

Основываясь на том, что я понимаю, я знаю, что мне нужно изменить ответ String на ArrayList, и мне нужно изменить цикл while, но я не знаю, что я должен делать точно.

Я попытался использовать следующий код, чтобы изменить метод, но он НЕ работал.

 private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<String>> { 
    @Override 
    protected ArrayList<String> doInBackground(String... urls) 
    { 
     ArrayList<String> response = new ArrayList<String>(); 
     for (String url : urls) 
     { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try 
      { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = response.toString(); 
       while ((s = buffer.readLine()) != null) 
       { 
        JSONArray ja = new JSONArray(s); 
        for (int i = 0; i < ja.length(); i++) { 
         JSONObject jo = (JSONObject) ja.get(i); 
         response.add(jo.getString("rates")); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
} 

Любая помощь будет принята с благодарностью.

@Dheeraj, UPDATE:

while ((s = buffer.readLine()) != null) 
    { 
     JSONArray ja = new JSONObject().getJSONArray("rates"); 
     response.add(ja.toString()); 
    } 

Это то, что я до сих пор Dheeraj. Я зациклился на том, как предоставить буфер JSONObject. Вы можете мне помочь?

+0

Как это не работает? – huntsfromshadow

+0

Он побежал, и это не дает мне какие-либо ошибки, но когда я добавил этот метод: – sameetandpotatoes

+0

защищен недействительным onPostExecute (ArrayList результата) { \t \t \t tv.setText (result.get (0)); } Это означает, что результат не содержит ничего (было вызвано событие IndexOutofBoundsException) – sameetandpotatoes

ответ

1
  1. Оставить весь буфер, который вы получаете из сети, до JSONObject.
  2. [Edit: Исправленные благодаря @MisterSquonk] Из JSONObject получить значение «ставки» в качестве еще одного JSONObject с использованием getJSONObject("rates").
  3. Идите по клавишам объекта «ставки», чтобы получить его значения.

Вот код:

private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<String>> { 
    @Override 
    protected ArrayList<String> doInBackground(String... urls) { 
     ArrayList<String> response = new ArrayList<String>(); 
     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(ratesObj.getString(keys.next())); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return response; 
    } 
} 
+0

Использование библиотеки разбора JSON - это именно то, что вы хотите сделать здесь. Код, который вы указали выше, действительно изобретает колесо, потому что есть уже надежные решения вашей проблемы. Используйте библиотеку, без головных болей! – mtmurdock

+0

Я был бы очень признателен, если бы вы могли написать то, что вы указали в коде. Я не уверен, как кодировать то, что вы сказали. Спасибо. – sameetandpotatoes

+0

@ user1193587 Я хотел бы помочь вам, если вы попытаетесь скомпоновать его и опубликовать любые проблемы, с которыми вы сталкиваетесь. –