我有一个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);
答案 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