AsyncTask不会让我使用自己的类

时间:2013-05-20 01:41:45

标签: android android-listview android-asynctask baseadapter

我有一个AsyncTask通过每次创建一个类的新实例来加载ListView中的条目,其中将保存变量并让它们从作为BaseAdapter扩展的自己的适配器加载。

该课程如下:

public class PictureResults
{
    private long id;
    private String pictureURL;

    public void setId(long id)
    {
        this.id = id;
    }

    public long getId()
    {
        return id;
    }

    public void setPictureURL(String pictureURL)
    {
        this.pictureURL = pictureURL;
    }

    public String getPictureURL()
    {
        return pictureURL;
    }
}

这是我的AsyncTask类:

private class getPictureDataTask extends AsyncTask<Long, String, Void>
    {
        protected PictureResults doInBackground(Long... param)
        {
                PictureResults pr;

                pr = new PictureResults();
                pr.setId(param[0]);
                pr.setPictureURL("http://www.myurl.com");

                return pr;
        }

        protected void onProgressUpdate(String... response)
        {
            //do nothing
        }

        protected void onPostExecute(PictureResults ret)
        {
            picResults.add(ret); //picResults is an ArrayList<PictureResults>
            ret.loadPicture(customAdapter);
            customAdapter.notifyDataSetChanged();
        }
    }

出现的主要问题是Eclipse让我知道以下内容:

The return type is incompatible with AsyncTask<Long,String,Void>.doInBackground(Long[])

特别是customAdapter.notifyDataSetChanged();将在onPostExecute中执行非常重要,因为在onProgressUpdate中,有时我的应用程序崩溃导致从后台线程更改ListView。

为什么我不能将PictureResults用作类型???

BTW:这就是我执行AsyncTask的方式:

Long hey = (long) 1;
new getPictureDataTask().execute(hey);

5 个答案:

答案 0 :(得分:1)

AsyncTask的第三个类型参数应为PictureResults而不是Void

class getPictureDataTask extends AsyncTask<Long, String, PictureResults>

因为AsyncTask的第3个参数类型是应该返回什么样的数据结果。如果您不想从doInBackground()返回任何结果,请使用Void然后return null;

答案 1 :(得分:0)

您应该将其更改为AsyncTask

答案 2 :(得分:0)

当你想要返回PictureResults时,你应该在AsyncTask中声明。

private class getPictureDataTask extends AsyncTask<Long, String, PictureResults>
{
    ......
}

答案 3 :(得分:0)

在实现AsyncTask时,请查看尖括号中的3个参数。

AsyncTask<Params, Progress, Result>  

Params由doInBackground()方法获取,当您使用excute()启动任务时,它会传递它;
结果应该通过doInBackground()方法返回,并由onPostExecute(Result ret)方法获取。
每个应该是您实现自定义任务类时定义的类型 更多信息是here

答案 4 :(得分:0)

您应该将AsyncTask更改为AsyncTask