Foros del Web » Programando para Internet » Android »

[SOLUCIONADO] problema con AsyncTask

Estas en el tema de problema con AsyncTask en el foro de Android en Foros del Web. Buenas 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 ...
  #1 (permalink)  
Antiguo 25/06/2013, 09:07
 
Fecha de Ingreso: octubre-2012
Ubicación: Madrid
Mensajes: 67
Antigüedad: 11 años, 5 meses
Puntos: 1
problema con AsyncTask

Buenas

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:
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());
		}                
		
	}
y este sería el código de la clase Post:

Código:
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]);
	}
}
Cómo podría solucionarlo?? no sé qué estaría mal? ni por qué la primera vez lo hace pero la segunda no...

Última edición por educdd; 25/06/2013 a las 10:49 Razón: faltaba codigo
  #2 (permalink)  
Antiguo 26/06/2013, 02:26
 
Fecha de Ingreso: octubre-2012
Ubicación: Madrid
Mensajes: 67
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: problema con AsyncTask

Ya sé cual es el problema. Si he creado un objeto que hereda de asincTask no puedo hacer varios asincTask.execute(params), tengo que crear un objeto nuevo cada vez.

Gracias a todos los que habéis leido esto aunque no hayáis contestado.

Etiquetas: todo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:23.