我在android中有一个应用程序从http
页面检索图片。我正在使用AsyncTask线程询问这张图片。
我就是这样做的:
mPostButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
for(int i=0;i<friends.size();i++)
{
getUserPic(friends.get(i).getId());
}
}
});
我有一个名为ArrayList
的{{1}},并且我正在调用方法的每个项目:friends
执行getUserPic()
线程:
AyncTask
所以每次调用public void getUserPic(String userID){
final String imageURL;
Bitmap bitmap=null;
imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
task.execute(new String[] {imageURL});
}
都会使用AsyncTask线程来调用getUserPic()
。
问题是我得到FC ....这里是我的logcat的样子:
imageURL
任何人,对此有任何解决方案吗?谢谢你!
答案 0 :(得分:5)
对于循环的每次迭代,您使用相同的task
对象(这就是错误说“任务已在运行”的原因)。您可以通过为每次迭代创建一个新的任务对象来解决此问题,例如
MyTask task = new MyTask();
task.execute(new String[] {imageURL});
但是,如果最终开始执行大量任务,那么这样做可能会非常糟糕。所以你最好有一个任务并给它一个要下载的图像列表。 E.g。
ids = new ArrayList<String>();
for(int i=0;i<friends.size();i++)
{
ids.add(friends.get(i).getId());
}
getUserPics(ids);
然后,您的getUserPic
方法会将所有ID传递给单个任务实例。
public void getUserPics(List<String> userIDs){
final String imageURL;
Bitmap bitmap=null;
String[] imageURLs = new String[userIDs.legnth()];
for(int i = 0; i < userIDs.length(); i++) {
imageURLs[i] ="http://graph.facebook.com/"+userIDs[i]+"/picture?type=small";
}
task.execute(imageURLs);
}
这样做,您可能希望在publishProgress
上使用AsyncTask
使用您目前已下载的图片更新您的用户界面,而不是等到拥有它们时结束所有
答案 1 :(得分:2)
在这种情况下,错误是非常自我描述的。该任务实际上已经在运行。因为你是在循环中运行它,所以你需要为每次迭代初始化一个新的异步任务,然后启动它。
啊,并行化代码的乐趣:)
答案 2 :(得分:2)
public void getUserPic(String userID){
final String imageURL;
Bitmap bitmap=null;
imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
new task().execute(new String[] {imageURL});
}