마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

RejectedExecutionException 문제 입니다.

0 추천
서버에서 스티커를 가져와서 리스트뷰로 뿌려주고있는데

갤럭시 2에서 RejectedExecutionException이 발생하네요.

imageLoaderTask.execute(hm); 이 라인에서 발생하구요
imageLoader.execute(hm1);

전체 소스는

public void onPostExecute(SimpleAdapter adapter) {

   // Setting adapter for the listview
   length = adapter.getCount();
   bitObject = new Bitmap[100];
   bitBicObject = new Bitmap[100];
   Log.i("HYY", "length-->" + length);
   for (int i = 0; i < length; i++) {

    HashMap<String, Object> hm = (HashMap<String, Object>) adapter
      .getItem(i);
    HashMap<String, Object> hm1 = (HashMap<String, Object>) adapter
      .getItem(i);
    String imgUrl = (String) hm.get("flag_path");
    String imgBicUrl = (String) hm1.get("big_path");
    
    ImageLoaderTask imageLoaderTask = new ImageLoaderTask();

    ImageLoader imageLoader = new ImageLoader();

    hm.put("flag_path", imgUrl);
    hm.put("position", i);
    hm1.put("big_path", imgBicUrl);
    hm1.put("position", i);
    imageLoaderTask.execute(hm);
    imageLoader.execute(hm1);

   }// end for
  } // end onPostExecute

입니다.

// json 데이터를 다운로드할 새로운 비 UI 스래드 작업만들기
  DownloadTask downloadTask = new DownloadTask();
  Log.i("HYY", "2");

  // 다운로드 프로세스를 시작
  downloadTask.execute(strUrl);
  Log.i("HYY", "3");

  mHandler.post(new Runnable() {

   @Override
   public void run() {
    mPhotoBitmap = BitmapFactory.decodeFile(path + imagename);
    selctImage.setImageBitmap(mPhotoBitmap);
    try {
     Thread.sleep(500);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  });

쓰레드 슬립을 해주니깐 최신폰에서는 잘 돌아가는데 유독 갤럭시 2에서는 자꾸 팅기네요

 

선배님들의 힌트를 부탁합니다^^
쿵뿌팬더 (3,440 포인트) 님이 2013년 6월 1일 질문

1개의 답변

0 추천
쓰레드 사용하는 쓰레드 풀에서 너무많은 쓰레드를 생성되서 오류가 발생한것 같습니다. for문에서 execute할때마다 쓰레드가 생성될텐데 저런구조는 좋지 않습니다. 어차피 쓰레드가 많이 생성되도 코어개수정도밖에 동시에 동작 못시키기때문입니다.
congbab (5,140 포인트) 님이 2013년 6월 1일 답변
답변 감사합니다. 쓰레드가 많이 생성되서 오류가 발생한건 알겠는데
for문이 없이 어떻게 execute해줘야 할지... 그걸 모르겠네요
지금 for문을 돌리면서 이미지로딩태스크를 만들어서 이미지를 로딩시키고 있는데 저렇게 하지 않고 이미지로딩태스크를 하나 만들고 그안에서 for문 돌면서 이미지를 로딩시키면 똑같은 동작을 구현해 놓을 수 있습니다.
아니면 큐를 이용하셔도 됩니다.(쓰레드풀을 보면 쓰레드 돌리는 것도 큐를 이용하고 있으니 현재 동작방식하고 별차이 없을 겁니다)
정확히 왜 저렇게 구현하신건지 몰라서... 정확한 답변을 못해드릴거 같아요.
이미지로딩태스크안에 for 문을 돌리면 뜨래드를 한번사용하는건데ㅔ 그럼 이미지 불러오는 속도가 느려지는데 다른 방법이 없나요?
congbab님 답변 감사합니다.
이미지로딩 태스크 안에서 for문을 돌리는 경우 속도 손실이 너무 크네요
...