2011-07-17 32 views
0

我有一個應用程序在android中檢索從http page.I'm圖片使用AsyncTask線程。錯誤從AsyncTask線程

這是我要做的事:

mPostButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

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

我有一個名爲ArrayListfriends爲列表中的每個項目我打電話的方法: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

的問題是,我得到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) 

任何人,任何解決這個感謝ü!

回答

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

    } 
2

在這種情況下,錯誤是相當自我描述性的。該任務實際上已經在運行。因爲你在一個循環中運行它,所以你需要爲每個迭代初始化一個新的異步任務並且啓動它。

啊,並行化代碼的樂趣:)

+0

我知道...但我不知道如何解決它!!沒有睡眠的方法,所以我要求一個解決方案! – adrian

+0

你可以發表一下如何做的代碼嗎?Thx – adrian

5

您使用相同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方法會將所有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); 
} 

這樣做,這樣,你可能想使用publishProgressAsyncTask與到目前爲止你下載,而不是等到當你把它們都結束圖像,以更新UI。

+0

沒問題....但已經接受了一個答案。只有贊成你:) – adrian

+1

這是一個更好的答案,你可以隨時取消選擇其他答案並將其標記爲正確的:-) –