Estoy realizando una aplicación que debe consultar varias urls de donde conseguir la información que después tendrá que mostrar por pantalla. He creado una clase Post que hereda de AsyncTask y el caso es que la primera vez que la ejecuto, se ejecuta perfectamente, el problema es cuando intento volver a ejecutarla. Cuando la ejecuto por segunda ve, al llamar al método execute me da un error diciendo que esa tarea ya está ejecutándose.
este sería el código de la clase que llama a la clase post:
Código:
y este sería el código de la clase Post:public class MainActivity extends Activity { ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Post p= new Post(); JSon json = new JSon(); ArrayList<Object> items = new ArrayList<Object>(); ArrayList<Object> items2 = new ArrayList<Object>(); lv = (ListView)findViewById(R.id.menu_list); ArrayList<Object> params = new ArrayList<Object>(); params.add(Constants.STREAM); params.add(Constants.NO_TAG); params.add(Constants.ACTUAL); try { p.execute(params); String datos = p.get(); Log.e("log_tag", datos); params.clear(); params.add(Constants.STREAM); params.add(datos); json.execute(params); items = (ArrayList)json.get(); params.clear(); params.add(Constants.VIDEO); params.add(Constants.NO_TAG); params.add(Constants.ACTUAL); p.execute(params); //Aquí da el error!!!! datos = p.get(); Log.e("log_tag", datos); params.clear(); params.add(Constants.VIDEO); params.add(datos); json.execute(params); items2 = (ArrayList)json.get(); } catch (InterruptedException e) { Log.e("log_tag1", e.getMessage()); } catch (ExecutionException e) { Log.e("log_tag2", e.getMessage()); } }
Código:
Cómo podría solucionarlo?? no sé qué estaría mal? ni por qué la primera vez lo hace pero la segunda no... public class Post extends AsyncTask<Object, Void, String> { private InputStream is = null; private String respuesta = null; String url = ""; short cat; // cat de la que se quiere obtener json short tag; // tag del que se quieren obtener los json String fecha; ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); public Post(/*Context context*/) { this.cat = -1; this.tag = -1; } public Post(short cat, short tag) { this.cat = cat; this.tag = tag; } /****************************************************************** * Obtiene el Json con la información que se desea * * @param ArrayList * parametros Parametros que se quieren enviar * ******************************************************************/ public String obtenerJson(ArrayList<Object> parametros) { crearParametrosUrl(parametros); conectaPost(url); if (is != null) { getRespuestaPost(); } return respuesta; } /****************************************************************** * Crea los parámetros que se van a enviar en la petición post * * @param ArrayList * parametros Parametros que se quieren enviar * ******************************************************************/ private void crearParametrosUrl(ArrayList<Object> parametros) { boolean completa = false; //Para determinar si la url necesita cat, fec y clave o no cat = (Short) parametros.get(0); tag = (Short) parametros.get(1); switch (cat) { case Constants.STREAM: // generacion de parametros para streaming url = Constants.URL_STREAM; break; case Constants.VIDEO: // generacion de parametros para los videos (app de streaming) url = Constants.URL_VIDEO; break; } long fecha; if (parametros.get(2).equals(Constants.ACTUAL)) fecha = System.currentTimeMillis() / 1000L; else fecha = obtenerFecha((String) parametros.get(2)); if(!completa) url = url.concat("?"+Constants.PARAMETRO_FECHA+"="+Long.toString(fecha)); else url = url.concat("&"+Constants.PARAMETRO_FECHA+"="+Long.toString(fecha)); } /****************************************************************** * Envia un mensaje post con los parametros deseados a la direccion indicada * * @param ArrayList * parametros Parametros que se quieren enviar * @param String * URL URL del servicio * ******************************************************************/ private void conectaPost(String url) { try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.e("log_tag", "Error in http connection " + e.toString()); } finally { } } /****************************************************************** * Obtiene una respuesta del servidor correspondiente a la peticion * realizada * * @return String (codigo completo de la respuesta HTTP) * ******************************************************************/ private String getRespuestaPost() { try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "utf-8"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); respuesta = sb.toString(); } catch (Exception e) { Log.e("log_tag", "Error converting result " + e.toString()); } return respuesta; } private long obtenerFecha(String fecha) { fecha = fecha.substring(5, 25); SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy HH:mm:ss"); Date res = null; try{ res = format.parse(fecha); }catch(Exception e) { Log.e("Error_interno", "Error al formatear la fecha"); } return res.getTime() / 1000L; } protected String doInBackground(Object... params) { return obtenerJson((ArrayList<Object>) params[0]); } }