Подтвердить что ты не робот

Как передать различные объекты в качестве параметра в AsycTask?

Я использую следующий код для создания 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 объектов с ходом void и boolean возвращаемого типа.

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

4b9b3361

Ответ 1

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

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 действительно являются файлом или вашим пользовательским списком с помощью instanceof.

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

Ответ 2

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

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

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

Ответ 3

Один из вариантов состоит в том, чтобы иметь конструктор вашего 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() - это список varargs, а не один объект.