2011-09-03 37 views
16

Estoy usando tareas de Async para obtener una cadena de la actividad del menú y cargar algunas cosas ... pero estoy no puedo hacerlo ... Lo estoy usando de la manera correcta y estoy pasando el parámetros correctamente? Consulte el fragmento de código. graciasPasando los parámetros a Asynctask

private class Setup extends AsyncTask<Void, Integer, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      if (!(getIntent().getExtras().isEmpty())) { 
       Bundle gotid = getIntent().getExtras(); 
       identifier = gotid.getString("key"); 
      } 
     } catch (Exception e) { 
      e.getStackTrace(); 
     } finally { 

      if (identifier.matches("abc")) { 
       publishProgress(0); 
       db.insert_fri(); 
      } else if ((identifier.matches("xyz"))) { 
       publishProgress(1); 
       db.insert_met(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... i) { 
     // start the song here 
     if (i[0] == 0) { 
      song.setLooping(true); 
      song.start(); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void res) { 

    } 

    @Override 
    protected void onPreExecute() { 
     // do something before execution 
    } 
} 

Respuesta

15

En lugar de esto yo haría

private class Setup extends AsyncTask<String, Integer, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
    String identifier = params[0]; 

      if (identifier.matches("abc")) { 
       publishProgress(0); 
       db.insert_fri(); 
      } else if ((identifier.matches("xyz"))) { 
       publishProgress(1); 
       db.insert_met(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... i) { 
     // start the song here 
     if (i[0] == 0) { 
      song.setLooping(true); 
      song.start(); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void res) { 

    } 

    @Override 
    protected void onPreExecute() { 
     // do something before execution 
    } 
} 

y comprobar si hay "identificador" antes de invocar el AsyncTask para evitar sobrecarga de crear un AsyncTask

como esto

if (!(getIntent().getExtras().isEmpty())) { 
       Bundle gotid = getIntent().getExtras(); 
       identifier = gotid.getString("key"); 
       new Setup().execute(identifier); 
    } 
4

Una manera simple es agregar un constructor:

public Setup(String a, Int b) { 
    this.a = a; 
    this.b = b; 
} 
0

AsyncTask significa que doInBackground() devuelve Void, onProgressUpdate() toma Integer params y doInbackground takes ... String params!

Así que no necesita (y REALMENTE no debería) usar Intent, ya que está destinado a ser usado para pasar argumentos a través de Actividades, no de Hilos.

Y según lo dicho antes, se puede hacer un constructor y un parámetro global de su clase llamada "identificador"

public class Setup... 
{ 
    private String identifier; 

    public Setup(String a) { 
    identifier = a; 
    } 
} 

esperaba que podría ayudar. Saludos

23

Evite agregar un constructor.

Basta con pasar sus parametros en la tarea de ejecutar el método

new BackgroundTask().execute(a, b, c); // can have any number of params 

Ahora su clase de fondo debe tener este aspecto

public class BackgroundTask extends AsyncTask<String, Integer, Long> { 

    @Override 
    protected Long doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     String a = arg0[0]; 
     String b = arg0[1]; 
     String c = arg0[2]; 
     //Do the heavy task with a,b,c 
     return null; 
    } 
    //you can keep other methods as well postExecute , preExecute, etc 

} 
+4

"evitar la adición de un constructor" ¿por qué? Estoy tratando de determinar por qué usar un constructor para iniciar campos privados en una asynctask es algo malo en Android. – bsautner

+0

No lo dije como una mala idea, pero solo por pasar params, no vaya por la ruta del constructor ya que terminará desperdiciando memoria. – HimalayanCoder

+1

¿Cuánta memoria podría desperdiciar? –

Cuestiones relacionadas