2012-01-12 7 views
4

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

  • Получить список бизнес (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() возвращает пустой ответ. Как я могу это исправить?

+0

добавить заявление журнала в вашем doInBackground, который регистрирует струнный returno после того, как прибудете было чтобы убедиться, что сообщение возвращается. –

ответ

12

Я думаю, вы не поняли именно так, как 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); 
+0

+1, потому что вы предоставили более длинный ответ – sfratini

+0

Спасибо, вы ответите мне! –

+0

Вот что я искал! Благодаря ! – Matthias

1

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

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

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

+0

Я думал, что метод get() вызывает execute(), потому что в документации говорится, что он ждет завершения вычисления ... Хорошо, я попробую позвонить ему раньше. –

+0

Итак, как я могу обработать диалоговое окно, которое будет отображаться во время выполнения запроса, и отклонить его, когда это будет сделано? –

+1

Это может быть правильно, но возвращаемое значение не приходит из метода .get, оно переходит к вашему OnPostExecute. См. Строку, входящую в метод. Это ваш ответ от HTTPConnection. – sfratini

1

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

попробовать этот код:

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