来自AsyncTask线程的错误

adr*_*ian 0 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());
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

我有一个ArrayList调用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});

    }
Run Code Online (Sandbox Code Playgroud)

所以每次调用都会getUserPic()使用AsyncTask线程来调用imageURL.

问题是我得到FC ....这里是我的logcat的样子:

java.lang.IllegalStateException: Cannot execute task: the task is already running.
   at android.os.AsyncTask.execute(AsyncTask.java:380)
   at com.facebook.android.Example.getUserPic(Example.java:129)
   at com.facebook.android.Example$3.onClick(Example.java:114)
   at android.view.View.performClick(View.java:2364)
   at android.view.View.onTouchEvent(View.java:4179)
   at android.widget.TextView.onTouchEvent(TextView.java:6540)
   at android.view.View.dispatchTouchEvent(View.java:3709)
   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*lka 5

task为循环的每次迭代使用相同的对象(这就是错误说"任务已在运行"的原因).您可以通过为每次迭代创建一个新的任务对象来解决此问题,例如

MyTask task = new MyTask();
task.execute(new String[] {imageURL});
Run Code Online (Sandbox Code Playgroud)

但是,如果您最终开始执行大量任务,那么这样做可能会非常糟糕.所以你最好有一个任务并给它一个要下载的图像列表.例如

ids = new ArrayList<String>();
for(int i=0;i<friends.size();i++)
{
    ids.add(friends.get(i).getId());
}
getUserPics(ids);
Run Code Online (Sandbox Code Playgroud)

然后,您的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);
}
Run Code Online (Sandbox Code Playgroud)

这样做,您可能希望使用publishProgresson AsyncTask来更新您到目前为止已经下载的图像的UI,而不是等到最后才拥有它们.