2012-08-22 8 views
7

Acabo de leer y probar AsyncTask recientemente y ahora necesito saber cómo puedo pasar varios valores en la parte onPostExecute. Bueno, yo uso un analizador JSON para obtener valores de la web, pero los valores que obtengo de JSON son valores múltiples en los que transfiero esos valores a una matriz separada por los encabezados de columna de cada dato y esta es la parte donde supongo que debo devolverlo para el uso onPostExecute. Pero hasta donde sé, solo puedes usar el retorno una vez por ejecución (corrígeme si me equivoco, por favor).Android AsyncTask devuelve varios valores en doInBackground para ser utilizado en onPostExecute

Bueno aquí está mi código hasta ahora:

public class GetInfo extends AsyncTask<String, Void, List<String>>{ 

     private final String TAG = null; 
     InputStream is = null; 
     StringBuilder sb=null; 
     List<String> list = new ArrayList<String>(); 

     @Override 
     protected List<String> doInBackground(String... url) { 
      String result = ""; 

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

       //CONNECT TO DATABASE 
       try{ 
         HttpClient httpclient = new DefaultHttpClient(); 
         HttpPost httppost = new HttpPost(url[0]); 
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         HttpResponse response = httpclient.execute(httppost); 
         HttpEntity entity = response.getEntity(); 
         is = entity.getContent(); 
         Log.v(TAG, "connected"); 
       }catch(Exception e){ 
         Log.v(TAG, "run failed"); 

         Log.e("log_tag", "Error in http connection "+e.toString()); 
       } 

       //BUFFERED READER FOR INPUT STREAM 
       try{ 
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
        sb = new StringBuilder(); 
        String line = "0"; 

        while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
        } 
        is.close(); 
        result=sb.toString(); 
        Log.v(TAG, "buffered read"); 
       }catch(Exception e){ 
        Log.v(TAG, "buffered error"); 
         Log.e("log_tag", "Error converting result "+e.toString()); 
       } 

       //CONVERT JSON TO STRING 
       try{ 
        Log.v(TAG, result); 

         JSONArray jArray = new JSONArray(result); 
         JSONObject json_data=null; 

         for(int i=0;i<jArray.length();i++){ 
          Log.v(TAG, "loop start"); 

           json_data = jArray.getJSONObject(i); 
           list.add(json_data.getString("id")); 
           list2.add(json_data.getString("city")); 
           Log.v(TAG, "list added"); 
         } 

       }catch(JSONException e){ 
        Log.v(TAG, "rest failed"); 
         Log.e("log_tag", "Error parsing data "+e.toString()); 
       } 

       Log.v(TAG, list.toString()); 

       return list; //I also need to return the list2 here 

     } 

     @Override 
     protected void onPostExecute(List<String> result) { 
      cities = result; //lost in this part hahaha! 
      showCities(); 
     } 

    } 

Bueno para añadir, este código funciona bien cuando vuelva sólo una matriz de cadenas (la lista), pero me confundo ahora en la segunda parte. También las ciudades se declaran en la clase principal y las ShowCities() solo se utilizan para la visualización. Entonces no me molesto en agregar los códigos.

+0

use onPregressUpdate, e implemente su lógica postExecute allí – rajpara

Respuesta

5

puede Hacer una cosa Haga que su ArrayList sea estática y acceda a ella cuando lo desee.

public static List<String> LIST = new ArrayList<String>(); 
public static List<String> LIST1 = new ArrayList<String>(); 

public class GetInfo extends AsyncTask<String, Void, List<String>>{ 

     private final String TAG = null; 
     InputStream is = null; 
     StringBuilder sb=null; 


     @Override 
     protected List<String> doInBackground(String... url) { 
      String result = ""; 

      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

       //CONNECT TO DATABASE 
       try{ 
         HttpClient httpclient = new DefaultHttpClient(); 
         HttpPost httppost = new HttpPost(url[0]); 
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         HttpResponse response = httpclient.execute(httppost); 
         HttpEntity entity = response.getEntity(); 
         is = entity.getContent(); 
         Log.v(TAG, "connected"); 
       }catch(Exception e){ 
         Log.v(TAG, "run failed"); 

         Log.e("log_tag", "Error in http connection "+e.toString()); 
       } 

       //BUFFERED READER FOR INPUT STREAM 
       try{ 
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
        sb = new StringBuilder(); 
        String line = "0"; 

        while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
        } 
        is.close(); 
        result=sb.toString(); 
        Log.v(TAG, "buffered read"); 
       }catch(Exception e){ 
        Log.v(TAG, "buffered error"); 
         Log.e("log_tag", "Error converting result "+e.toString()); 
       } 

       //CONVERT JSON TO STRING 
       try{ 
        Log.v(TAG, result); 

         JSONArray jArray = new JSONArray(result); 
         JSONObject json_data=null; 

         for(int i=0;i<jArray.length();i++){ 
          Log.v(TAG, "loop start"); 

           json_data = jArray.getJSONObject(i); 
           LIST.add(json_data.getString("id")); 
           LIST1.add(json_data.getString("city")); 
           Log.v(TAG, "list added"); 
         } 

       }catch(JSONException e){ 
        Log.v(TAG, "rest failed"); 
         Log.e("log_tag", "Error parsing data "+e.toString()); 
       } 

       Log.v(TAG, list.toString()); 

       return LIST; //I also need to return the list2 here 

     } 

     @Override 
     protected void onPostExecute(List<String> result) { 
      cities = result; //lost in this part hahaha! 
      showCities(); 
     } 

    } 

ahora usted puede utilizar su tanto LISTA & LIST1 cuando lo desee. tampoco es necesario que devuelva el arraylist en DoInBackground.

Espero que te ayude.

+0

Tengo que ir por el momento, voy a volver a su respuesta más adelante. Gracias. – KaHeL

+0

Funciona bien como yo quería. Aunque creo que mi pregunta resultó en dos en una pregunta, pero esta es viable para mí. Gracias hombre. – KaHeL

+1

Hay muchos problemas con esta solución. Primero, las listas seguirán creciendo después de cada ejecución. Siguen agregando nuevos resultados y nunca los eliminan. En segundo lugar, esto no es seguro para subprocesos. si tienes dos AsyncTasks trabajando al mismo tiempo, tendrás una serie de problemas, como condiciones de carrera, modificación concurrente, etc. – Sameer

3

Crea una nueva clase con dos listas. Usa esa clase como el tipo de devolución.

+3

Ya existe la clase de utilidad [Pair] (http://developer.android.com/reference/android/util/Pair.html) en el SDK ... – Jens

+0

buscando en Google ese par. ¡Gracias! – KaHeL

Cuestiones relacionadas