Как передать разные объекты в качестве параметра AsycTask? - PullRequest
19 голосов
/ 03 февраля 2011

Я использую следующий код для создания AsyncTask.

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

    }

}

Теперь я хочу передать ему два параметра customlistobject и File объекты с пустым прогрессом и boolean тип возврата.

Я не знаю, как передать это customlistobject моему AsyncTask вместе с объектом File.

Ответы [ 3 ]

21 голосов
/ 03 февраля 2011

Не идеальным, но работающим решением является использование Object в качестве параметра.

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

Этот код является просто примером, вы должны убедиться, что объекты с индексами 0 и 1 действительно являются File или вашим CustomListиспользуя instanceof.

Октавиан Дамиан также написал хороший метод ...

7 голосов
/ 03 февраля 2011

Один из вариантов - иметь ваш конструктор AsyncTask, который принимает эти параметры

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

Другой вариант - передать объект в качестве параметра первого типа 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]);

Это работает, поскольку фактический параметр для doInBackground() является списком переменных, а не единственным объектом.

7 голосов
/ 03 февраля 2011

Если вам нужно передать ему два объекта в качестве параметра, просто создайте свой собственный держатель и отправьте ему объекты-держатели.

Вы создаете объект, который содержит ваш пользовательский объект вместе с объектом File. В зависимости от ситуации вы также можете сделать свой пользовательский объект просто удерживая объект File и передать AsyncTask пользовательский объект.

Внутри метода doInBackground просто извлеките объекты, чтобы вы могли обрабатывать их по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...