Android HTTP-запрос AsyncTask - PullRequest
       7

Android HTTP-запрос AsyncTask

4 голосов
/ 12 января 2012

Я хочу реализовать класс, который будет обрабатывать все HTTP-запросы моего приложения, которые будут в основном:

  • Получить список предприятий (GET);
  • Выполнить вход в систему (POST);
  • Обновить местоположение (POST).

Итак, мне нужно будет получить строку результата с сервера (JSON) и передать ее другим методам для обработки ответов.

В настоящее время у меня есть следующие методы:

public class Get extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... arg) {
        String linha = "";
        String retorno = "";

        mDialog = ProgressDialog.show(mContext, "Aguarde", "Carregando...", true);

        // Cria o cliente de conexão
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(mUrl);

        try {
            // Faz a solicitação HTTP
            HttpResponse response = client.execute(get);

            // Pega o status da solicitação
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();

            if (statusCode == 200) { // Ok
                // Pega o retorno
                BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

                // Lê o buffer e coloca na variável
                while ((linha = rd.readLine()) != null) {
                    retorno += linha;
                }
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return retorno;
    }

    @Override
    protected void onPostExecute(String result) {
        mDialog.dismiss();
    }
}

    public JSONObject getJSON(String url) throws InterruptedException, ExecutionException {
        // Determina a URL
        setUrl(url);

        // Executa o GET
        Get g = new Get();

        // Retorna o jSON
        return createJSONObj(g.get());
    }

Но g.get() возвращает пустой ответ. Как я могу это исправить?

Ответы [ 3 ]

13 голосов
/ 12 января 2012

Я думаю, вы не совсем поняли, как работает AsyncTask.Но я считаю, что вы хотите повторно использовать код для различных задач;если это так, вы можете создать абстрактный класс, а затем расширить его, реализуя созданный вами абстрактный метод.Это должно быть сделано так:

public abstract class JSONTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... arg) {
        String linha = "";
        String retorno = "";
        String url = arg[0]; // Added this line

        mDialog = ProgressDialog.show(mContext, "Aguarde", "Carregando...", true);

        // Cria o cliente de conexão
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(mUrl);

        try {
            // Faz a solicitação HTTP
            HttpResponse response = client.execute(get);

            // Pega o status da solicitação
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();

            if (statusCode == 200) { // Ok
                // Pega o retorno
                BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

                // Lê o buffer e coloca na variável
                while ((linha = rd.readLine()) != null) {
                    retorno += linha;
                }
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return retorno; // This value will be returned to your onPostExecute(result) method
    }

    @Override
    protected void onPostExecute(String result) {
        // Create here your JSONObject...
        JSONObject json = createJSONObj(result);
        customMethod(json); // And then use the json object inside this method
        mDialog.dismiss();
    }

    // You'll have to override this method on your other tasks that extend from this one and use your JSONObject as needed
    public abstract customMethod(JSONObject json);
}

И тогда код вашей активности должен выглядеть примерно так:

YourClassExtendingJSONTask task = new YourClassExtendingJSONTask();
task.execute(url);
1 голос
/ 12 января 2012

Похоже, что вы фактически никогда не запускаете AsyncTask, вызывая функцию execute () объекта Get.

попробуйте этот код:

Get g = new Get();
g.execute();
1 голос
/ 12 января 2012

Вы не выполняете задачу.Вы просто создаете это.Я думаю, вам нужно сделать:

Get g = new Get();
g.execute();

Но вы неправильно используете жизненный цикл задачи.OnPostExecute работает в главном потоке, где вы должны делать все обновления по мере необходимости.Вы можете передать задачу View, например.

...