2011-02-03 15 views
19

Korzystam z następującego kodu, aby utworzyć AsyncTask.Jak przekazać różne obiekty jako parametr do 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"); 

    } 

} 

Teraz chcę przekazać ją dwa parametry customlistobject i File obiektów z void postępu i boolean typ zwracany.

Nie wiem, jak przekazać ten customlistobject do mojego AsyncTask wraz z obiektem File.

Odpowiedz

21

Nieidealnym, ale działającym rozwiązaniem jest użycie Object jako parametru.

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"); 
    } 
} 

Ten kod jest tylko próbka, należy upewnić się, że obiekty o indeksie 0 i 1 są naprawdę pliku lub Twój CustomList za pomocą instanceof.

Octavian Damiean napisał również dobrą metodę ...

7

Jeśli musisz przekazać mu dwa obiekty jako parametr, po prostu utwórz własnego właściciela i wyślij mu przedmioty właściciela.

Tworzysz obiekt, który przechowuje Twój niestandardowy obiekt wraz z obiektem File. W zależności od sytuacji można również ustawić niestandardowy obiekt po prostu przytrzymaj obiekt File i przekazać obiekt niestandardowy.

Wewnątrz metody doInBackground po prostu wyodrębnij obiekty, aby móc je przetworzyć w razie potrzeby.

7

Jedną z opcji jest, aby mieć konstruktora swojego AsyncTask która pobiera te parametry

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]); 

Inną opcją jest przekazanie obiektu jako pierwszego parametru typu 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]); 

To działa, jak Rzeczywisty parametr do doInBackground() jest listą varargs, a nie pojedynczym obiektem.

Powiązane problemy