2014-08-05 4 views
0

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

Это мили класс:

class HttpAsyncTask extends AsyncTask<String, Void, String> 
{ 
    @Override 
    protected String doInBackground(String... urls) 
    { 
     return null; 
    } 
    // onPostExecute displays the results of the AsyncTask. 
    @Override 
    protected void onPostExecute(String result) 
    {  
     Log.i("ASYNC", "size: "+todo.size()); 
     displayListView(); 
    } 

    public String POST(String url) 
    { 
     InputStream inputStream = null; 
     String result = ""; 
     try 
     { 
      HttpClient httpclient = new DefaultHttpClient(); 
      //make POST request to the given URL 
      HttpPost httpPost = new HttpPost(url); 
      // pass parameters in this way 

      for(int i=0;i<preguntas.length;i++) 
      { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
       nameValuePairs.add(new BasicNameValuePair("id",String.valueOf(preguntas[i]))); 
       nameValuePairs.add(new BasicNameValuePair("te",tablas[i])); 

       //add data 
       httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       // 8. Execute POST request to the given URL 
       HttpResponse httpResponse = httpclient.execute(httpPost); 

       // 9. receive response as inputStream 
       inputStream = httpResponse.getEntity().getContent(); 

       // 10. convert inputstream to string 
       if(inputStream != null) 
       { 
        result = convertInputStreamToString(inputStream); 
        NumPregTem todoAux = new NumPregTem(); 
        todoAux.setBBDD(preguntas[i]) ; 
        todoAux.setTema(tablas[i]); 

        String[] aux = result.split(";"); 
        todoAux.setPreg(aux[0]); 
        todoAux.setRespA(aux[1]); 
        todoAux.setRespB(aux[2]); 
        todoAux.setRespC(aux[3]); 
        todoAux.setRespD(aux[4]); 
        todoAux.setRespV(aux[5]); 
        todo.add(todoAux); 
       } 
       else 
       { 
        result = "Did not work!"; 
       } 

      } 
      Log.i("ASYNC", "i've finished to query"); 
     } 

     catch (Exception e) 
     { 
       Log.d("InputStream", e.getLocalizedMessage()); 
     } 
     return result; 
    } 
} 

Моя проблема заключается в том, что в debbuger я вижу сообщение Log.i («ASYNC», «size:» + todo.size()); в onPostExecute() перед сообщением Log.i («ASYNC», «я закончил запрос»); в POST, и когда я использую todo.get (i) в моем основном классе (вызов displayListView()), этот объект имеет значение null.

благодарит вас!

я хочу, когда асинхронная задача завершена она вызывает displayListView()

PD: я называю POST в этой функции (в моем главном классе)

HttpAsyncTask httpAsyncTask = new HttpAsyncTask(); 
httpAsyncTask.execute("http://appdomain.hol.es/webService.php"); 
+0

Я не вижу ваш метод POST вызывались в любом месте – Droidman

+0

я отредактировал posthttpAsyncTask.execute, в моем главном классе у называют функция, которая вызывает, и когда асинхронная задача завершена, вы хотите вызвать displayLstView() – mdl

+0

, что вы делаете, это передать параметры вашей задаче. Метод POST() по-прежнему не вызывается. См. Ответы. Ваша задача на самом деле ничего не делает – Droidman

ответ

2

Вы, вероятно, хотите, чтобы вызвать метод POST() из doInBackground() как этот

@Override 
protected String doInBackground(String... urls) 
{ 
    return POST(myUrl); 
} 
+0

метод post вызывается в другой функции, я хочу, чтобы асинхронная задача завершила его вызовы disPlayListView() – mdl

+0

вы rigth @SimonSays, спасибо, я написал следующее: Override protected String doInBackground (String ..) . urls) \t { \t возвращение POST ("http://appdomain.hol.es/webService.php"); \t} \t \t Переопределение защищено недействительный onPostExecute (Строка результат) \t {\t \t \t displayListView(); \t} – mdl

+0

Извините, что задал этот вопрос в качестве комментария, можете ли вы потратить некоторую ссылку, например, положить панель, показывающую статус загрузки во время работы AsyncTask? Этот бар идет в методе POST? – mdl

0

Ну, беглое наблюдение ... The Метод doInBackground() - это код, который называется асинхронно. Когда этот метод завершается, он вызывает метод onPostExecute(). Прямо сейчас doInBackground() просто возвращает значение null, которое немедленно вызывает onPostExecute().

Я не уверен, когда вы вызываете свой метод POST, но если вы хотите, чтобы он выполнялся перед displayListView(), то бросьте его в doInBackground().

+0

Я хочу, чтобы метод displayListView() запускался, когда асинхронная задача заканчивается – mdl

Смежные вопросы