来自AsyncTask线程的错误

时间:2011-07-17 14:10:14

标签: android android-asynctask

我在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

任何人,对此有任何解决方案吗?谢谢你!

3 个答案:

答案 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});

    }