AsyncTask в Android? - PullRequest
       2

AsyncTask в Android?

0 голосов
/ 29 марта 2012

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

Это веб-сайт: 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, ОБНОВЛЕНИЕ:

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

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

1 Ответ

1 голос
/ 29 марта 2012
  1. Предоставьте весь буфер, который вы получаете из сети, в JSONObject.
  2. [ Edit: Исправлено благодаря @MisterSquonk] ИзJSONObject получить значение "rate" как другое JSONObject, используя getJSONObject("rates").
  3. Перебирать ключи объекта "rate", чтобы получить его значения.

Вот код:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...