0

I want to create my AsyncTask in separated classes because of I have to parse XML and it's a bunch of code.

So I want to get noticed in the activity everytime an asynctask is completed.

I followed this question

The problem is that when I have to make multiple petitions, everytime one is completed call the same method.

I want to call different methods depending of the AsyncTask Class I called.

EDIT: One of my AsyncTask Classes

public class FichaProducto extends AsyncTask<Void,Void,String>{
private String codigo, descripcion, ubicacion, descPromocion, currentUser,ip,port,codigoBuscar, respuesta;
private float precio;
private static final String TAG = "Logger";
private OnTaskCompleted listener;

/**
 * Without listener
 * @param codigoBuscar
 * @param currentUser
 * @param ip
 * @param port
 */
public FichaProducto(String codigoBuscar,String currentUser,String ip,String port) {
    setCodigoBuscar(codigoBuscar);
    setCurrentUser(currentUser);
    setIp(ip);
    setPort(port);
}
/**
 * With listener
 * @param codigoBuscar
 * @param currentUser
 * @param ip
 * @param port
 * @param listener
 */
public FichaProducto(String codigoBuscar, String currentUser, String ip, String port, OnTaskCompleted listener) {
    setCodigoBuscar(codigoBuscar);
    setCurrentUser(currentUser);
    setIp(ip);
    setPort(port);
    this.listener = listener;
}

/**
 * set the xml response
 * @param response
 */
public void setRespuesta(String respuesta) {
    this.respuesta = respuesta;
}

/**
 * @return server xml response
 */
@Override
protected String doInBackground(Void... params) {
    StringBuilder respuesta = new StringBuilder();
    URL url;

    HttpURLConnection conexion = null;

    try{
        //Create the connection and set parameters
        url = new URL("http://"+getIp()+":"+getPort());
        Log.d(TAG,url.toString());
        conexion = (HttpURLConnection)url.openConnection();
        conexion.setRequestMethod("POST");
        conexion.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conexion.setRequestProperty("Content-Length", "" + Integer.toString(getXML().getBytes().length));
        conexion.setRequestProperty("Content-Language", "es-ES");
        conexion.setUseCaches(false);
        conexion.setDoInput(true);
        conexion.setDoOutput(true);

        //Send the petition
        DataOutputStream dos = null;
        dos = new DataOutputStream(conexion.getOutputStream());
        dos.writeBytes(getXML());
        dos.flush();
        dos.close();

        //Get the response
        InputStream is = conexion.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String linea;
        while ((linea = br.readLine()) != null){
            respuesta.append(linea);
            respuesta.append("\n");
        }
        br.close();
        Log.d(TAG,"From asynctask the response is: "+respuesta.toString());
        return respuesta.toString();


    }catch(MalformedURLException e){
        Log.e(TAG,"MalformedURLException in AsyncTask "+e.getMessage());
        return null;
    }catch (IOException e){
        Log.e(TAG,"IO Exception in AsyncTask "+e.getMessage());
        return null;
    } finally {
        //Close the connection
        if (conexion != null){
            conexion.disconnect();
        }
    }
}

/**
 * Set the response and call the listener
 */
@Override
protected void onPostExecute(String respuesta){
    setRespuesta(respuesta);
    //Here it'll read the xml received and will set the variables
    if (listener != null){
        listener.onTaskCompleted();
    }
}

(If it's bad, excuse my english pls)

Brugui
  • 574
  • 6
  • 20

1 Answers1

0

To check which task is compelte you can use follow: Update OnTaskCompleted with onTaskCompleted(int id);

private OnTaskCompleted listener;
private int id;

public FichaProducto(String codigoBuscar, String currentUser, String ip, 
    String port, OnTaskCompleted listener, int id) {
    setCodigoBuscar(codigoBuscar);
    setCurrentUser(currentUser);
    setIp(ip);
    setPort(port);
    this.listener = listener;
    this.id = id
}

@Override
protected void onPostExecute(String respuesta){
    setRespuesta(respuesta);
    //Here it'll read the xml received and will set the variables
    if (listener != null){
        listener.onTaskCompleted(id);
    }
}

In activity class you can use something like this:

private final int PARSE_XML = 0
private final int PARSE_JSON = 1

void parseXml(){
  new FichaProducto(codigoBuscar, currentUser, ip, port, PARSE_XML)
}

@Override
onTaskCompleted(int id){
    switch (id){
      case PARSE_XML:
       break;
      case PARSE_JSON:
       break;
    }
}
Stanislav Bondar
  • 6,056
  • 2
  • 34
  • 46