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.
use onPregressUpdate, e implemente su lógica postExecute allí – rajpara