2011-02-03 8 views
19

Estoy usando el siguiente código para crear un AsyncTask.¿Cómo pasar diferentes objetos como un parámetro a AsycTask?

public class SaveFileToExternalStorage extends AsyncTask<File, Void, Boolean>{ 

    protected Boolean doInBackground(File... file) { 

     DalCategories c= new DalCategories(); 
     boolean result = c.saveObject(customlistobject,file[0]); 

     return result;  
    } 


    protected void onProgressUpdate() {  
     //setProgressPercent(progress[0]); 

    } 

    protected void onPostExecute(boolean result) {  
     //showDialog("Downloaded " + result + " bytes"); 

    } 

} 

Ahora quiero pasar dos parámetros customlistobject y File objetos con el progreso nulo y boolean tipo de retorno.

No sé cómo pasar ese customlistobject a mi AsyncTask junto con el objeto File.

Respuesta

21

Una solución no perfecta pero funcional es usar Object como parámetro.

public class SaveFileToExternalStorage extends AsyncTask<Object, Void, Boolean>{ 
    protected Boolean doInBackground(Object... param) { 
     File file = (File) param[0]; 
     List list = (CustomList) param[1]; 
     return result;  
    } 

    protected void onProgressUpdate() 
    {  
     //setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(boolean result) 
    {  
     //showDialog("Downloaded " + result + " bytes"); 
    } 
} 

Este código es sólo una muestra, debe asegurarse de que los objetos en el índice 0 y 1 son realmente un archivo o su CustomList utilizando instanceof.

Octavian Damiean también ha escrito un buen método ...

7

Si necesita pasar dos objetos como parámetro, solo cree su propio titular y envíele los objetos del titular.

Crea un objeto que contiene su objeto personalizado junto con el objeto Archivo. Dependiendo de la situación, también puede hacer que su objeto personalizado solo sostenga el objeto File y pase el AsyncTask el objeto personalizado.

Dentro del método doInBackground simplemente extraiga los objetos para que pueda procesarlos según sea necesario.

7

Una opción es tener un constructor de la AsyncTask que toma esos parámetros

public class SaveFileToExternalStorage extends AsyncTask<File, Void, Boolean>{ 
    List customlistobject; 

    public SaveFileToExternalStorage(List aList) { 
     customlistobject = aList; 
    } 

    protected Boolean doInBackground(File... file) { 

     DalCategories c= new DalCategories(); 
     boolean result = c.saveObject(customlistobject,file[0]); 

La otra opción es pasar objeto como primer parámetro tipo de AsyncTask:

public class SaveFileToExternalStorage extends AsyncTask<Object, Void, Boolean>{ 

    protected Boolean doInBackground(Object... objs) { 

     File file = (File) ibjs[1]; 
     List customlistobject = (List) objs[2]; 
     DalCategories c= new DalCategories(); 
     boolean result = c.saveObject(customlistobject,file[0]); 

Esto funciona, como se el parámetro real a doInBackground() es una lista varargs y no un solo objeto.

Cuestiones relacionadas