Приложение зависает при получении данных из интернета - PullRequest
1 голос
/ 22 июня 2011

У меня возникла проблема, которую, я уверен, решить очень просто, но я все еще начинаю разработку приложений, поэтому я подумал, что вы мне поможете. У меня есть приложение, в котором есть конвертер валют, и когда я нажимаю кнопку, чтобы получить конверсию, оно останавливается, пока получает данные из Интернета, а затем возвращается к жизни через несколько секунд. Вот код:

   public void capturaConversao(String m1, String m2) throws ClientProtocolException, IOException {
        BufferedReader resp = null;
        endereco = "http://download.finance.yahoo.com/d/quotes.csv?s=" + m1
                + m2 + "=X&f=sl1d1t1ba&e=.csv";
        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet method = new HttpGet(endereco);
            HttpResponse statusCode = client.execute(method);
            resp = new BufferedReader(new InputStreamReader(statusCode
                    .getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line = "";
            while ((line = resp.readLine()) != null) {
                sb.append(line);
            }
            resp.close();
            String result = sb.toString();
            String[] values = result.split(",");
            conversion = values[1];
            nextstep++;

        } finally {
            if (resp != null) {
                try {
                    resp.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(getBaseContext(), "Não foi possível se conectar à internet.", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

Ответы [ 4 ]

1 голос
/ 22 июня 2011

AsyncTask - это решение практически для всех проблем с пользовательским интерфейсом. :) Вот краткий учебник .

0 голосов
/ 22 июня 2011

Да, я также согласен использовать решение AsyncTask, и, поскольку оно известно как безболезненная многопоточность, пользователю не нужно беспокоиться об управлении потоками.

Для вашего случая просто вызовите метод capturaConversao () внутри doInBackground () (т.е. выполните все операции извлечения данных из Интернета внутри метода doInBackground) и вызовите метод отображения внутри onPostExecute ) (т. Е. Выполнять все операции отображения, например, отображать извлеченные значения внутри просмотра списка или просмотра текста).

0 голосов
/ 22 июня 2011

Доступные циклы вашего пользовательского интерфейса ограничиваются действиями HTTP. Отделите его с помощью Thread или AsyncTask

0 голосов
/ 22 июня 2011

Вы, вероятно, вызываете это из потока пользовательского интерфейса, чего не следует делать.Это блокирует пользовательский интерфейс, потому что поток пользовательского интерфейса занят подключением к Интернету. Вот учебник для совершения такого звонка .

...