如何将不同的对象作为参数传递给AsyncTask?

时间:2011-02-03 11:06:12

标签: android android-asynctask

我使用以下代码创建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");  

    }

}

现在我想传递两个参数customlistobjectFile对象,其中包含void进度和boolean返回类型。

我不知道如何将customlistobjectAsyncTask对象一起传递给File

3 个答案:

答案 0 :(得分:21)

一个不完美但有效的解决方案是使用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");  
    }
}

此代码只是一个示例,您应该使用instanceof确保索引0和1处的对象确实是File或CustomList。

Octavian Damiean也写了一个很好的方法......

答案 1 :(得分:7)

如果您需要将两个对象作为参数传递,只需创建自己的持有者并将其发送给持有者对象。

您创建一个对象,该对象包含您的自定义对象以及File对象。根据具体情况,您还可以使自定义对象只保留File对象并传递AsyncTask自定义对象。

doInBackground方法内部只提取对象,以便您可以根据需要进行处理。

答案 2 :(得分:7)

一个选项是让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列表而不是单个对象。