2011-07-18 149 views
0

我在android中有一個應用程序,我試圖從網上檢索一些使用AsyncTask線程的圖片。 事情是,我檢索loop這樣的圖片,所以我爲每個索引啓動一個新的AsyncTask線程。每個線程都會返回一張圖片(imageView)。幫助管理AsynTask線程

這裏是我的問題:

發起的線程返回圖片asynchorounsly所以當我試圖存取權限存儲這些圖片,我得到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()返回的變量。

我希望你明白我的mean.Thx

+0

'onPostExecute'方法在主(UI)線。你可能必須自己同步它。 – Mannaz

+0

我敢肯定,我必須這樣做,但我真的不知道如何:P – adrian

+0

我會用'@Override public void onPostExecute(Bitmap result){ imageView.setImageBitmap(result); synchronized(arrayImageView){ arrayImageView.add(imageView);} }' – Mannaz

回答

1

如果我是對的,你可以做到這一點..

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關閉此對話框。我認爲這是因爲在這一刻UI線程將被阻止,你可以確保你的imageView被初始化爲postExecute()中的某個值,並且當對話被解除並且UI線程恢復時可以返回。