ошибка из потока AsyncTask - PullRequest
0 голосов
/ 17 июля 2011

У меня есть приложение на 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 с именем 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});

    }

Таким образом, каждый раз, когда вызывается getUserPic() использует поток AsyncTask для вызова imageURL.

Проблема в том, что я получаю ФК .... вот как выглядит мой 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)

Кто-нибудь, какое-либо РЕШЕНИЕ к этому? Спасибо!

Ответы [ 3 ]

5 голосов
/ 17 июля 2011

Вы используете один и тот же объект task для каждой итерации цикла (именно поэтому ошибка говорит: «задача уже выполняется»).Вы можете исправить это, создав новый объект задачи для каждой итерации, например,

MyTask task = new MyTask();
task.execute(new String[] {imageURL});

Однако это может быть довольно бесполезным, если вы в конечном итоге запустите много задач.Поэтому вам может быть лучше иметь одно задание и дать ему список изображений для загрузки.Например,

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

Тогда ваш метод getUserPic передаст все идентификаторы одному экземпляру задачи.

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 для обновления вашего пользовательского интерфейса изображениями, которые вы уже загрузили, вместо того, чтобы ждать до конца, когда они у вас есть.

2 голосов
/ 17 июля 2011
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});

    }
2 голосов
/ 17 июля 2011

В этом случае ошибка довольно информативна.Задача на самом деле уже выполняется.Поскольку вы запускаете его в цикле, вам нужно инициализировать новую асинхронную задачу для каждой итерации и запускать ее.

Ааа, радости распараллеленного кода:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...