Помогите управлять потоками AsynTask - PullRequest
0 голосов
/ 18 июля 2011

У меня есть приложение на Android, и я пытаюсь получить некоторые фотографии из Интернета, используя поток AsyncTask. Дело в том, что я извлекаю эти изображения в loop, поэтому для каждого индекса я запускаю новый поток AsyncTask. Каждый поток возвращает изображение (imageView).

И вот моя проблема:

Запущенные темы возвращают изображения асинхронно, поэтому, когда я пытаюсь получить доступ к списку, в котором хранятся эти изображения, я получаю ArrayIndexOutofBounds.

Это мой код:

for(int i=0;i<friends.size();i++)
                    {
            getUserPic(friends.get(i).getId());
                    }

Это getUserPic метод:

  public void getUserPic(String userID){

        imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
    new Task().execute(new String[] {imageURL});

    }

А вот и нить:

 private class Task extends AsyncTask<String, Void, Bitmap>{

        @Override
        public Bitmap doInBackground(String...arg0){


            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(arg0[0]);
            try{
                HttpResponse execute = client.execute(httpGet);
                InputStream content = execute.getEntity().getContent();

        profilePicBitmap=BitmapFactory.decodeStream(content);


            }
           catch (MalformedURLException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
          return profilePicBitmap;

        }
        @Override
           public void onPostExecute(Bitmap result) {
                imageView.setImageBitmap(result);
                arrayImageView.add(imageView);
            }
}

Так что я хочу сделать что-то вроде:

  List<ImageView> arrayImageView=new ArrayList<ImageView>();



    for(i....)

    {
 arrayImageView[i]=getUserPic(...);
     }

 public ImageView getUserPic(String userID){

            imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
        new Task().execute(new String[] {imageURL});
return ImageView;

        }

Я имею в виду, что каждый ImageView возврат потоком AsyncTask будет возвращаться также методом getUserPic. Поэтому мне было бы легче их отслеживать.

Вопрос: Как мне поступить, чтобы возвращаемое AsynTask изображение было также переменной, которую возвращает getUserPic().

Надеюсь, вы понимаете, о чем я. Thx

1 Ответ

1 голос
/ 29 июля 2011

Если я прав, вы можете сделать это ..

 for(i....)

    {
 arrayImageView[i]=getUserPic(...);
     }

 public ImageView getUserPic(String userID){

            imageURL = "http://graph.facebook.com/"+userID+"/picture?type=small";
        new Task().execute(new String[] {imageURL});
progressDialog = ProgressDialog.show(context, "", "Please Wait....");//**progressDialog** an instance variable

return ImageView;

        }

и в postExecute закрыть этот диалог ... Я предлагаю это, потому что в этот момент поток пользовательского интерфейса будет заблокирован, и вы можете убедиться, что вашimageView инициализируется с некоторым значением в postExecute() и может быть возвращено, когда диалог закрывается и поток пользовательского интерфейса возобновляется.

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