2011-07-17 5 views
0

나는 http 페이지에서 그림을 검색하는 android의 응용 프로그램을 가지고 있습니다. AsyncTask 스레드를 사용하여이 그림을 요청하고 있습니다.AsyncTask 스레드의 오류

이다 나는 그것을 할 방법 :

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

    } 
하십시오 AyncTask 스레드를 실행 getUserPic() :
mPostButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

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

나는 ArrayListfriends라고하고 목록의 모든 항목에 대해 내가 메서드를 호출하고있어이

때마다 getUserPic()은 AsyncTask 스레드를 사용하여 imageURL을 호출합니다.

문제는 여기에 .... 내가 FC를 얻을처럼 내 로그 캣이 모습입니다 :

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) 

사람이 어떤 해결책 U 감사합니다!

답변

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

, 당신은 아마 당신이 아니라 당신이 그들 모두가 끝날 때까지 기다리지 않고, 지금까지 다운로드 한 이미지로 UI를 업데이트 할 AsyncTaskpublishProgress를 사용하는 것이 좋습니다.

+0

괜찮습니까 ....하지만 이미 대답을 받아 들였습니다 .Unly Thumbs up for u :) – adrian

+1

이것은 훨씬 더 좋은 대답입니다. 다른 대답은 선택 취소 할 수 있습니다. 이 하나를 올바른 것으로 표시하십시오 :-) –