2010-03-22 4 views
15

원격 서버에서 많은 미리보기 이미지를 가져 와서 AsyncTask를 사용하여 그리드보기로 표시하고 있습니다. 문제는 내 그리드 뷰가 한 번에 20 개의 축소판을 표시하므로 축소판 당 20 개의 AsyncTasks와 20 개의 실행을 생성한다는 것입니다.AsyncTask, RejectedExecutionException 및 Task Limit

내 코드에서 RejectedExecution 예외가 발생합니다. AsyncTask가 한 번에 대기열에 가질 수있는 작업의 수에 제한이 있다는 것을 나는 어딘가에 기억하고있다. 이 술집이 들었나요?

이 한도를 늘릴 수있는 방법이 있습니까? catch(RejectedException e){} 블럭이 비어 있음)

이 코드는 Android 1.6 에뮬레이터에서 실행 중이며 API 레벨은 내 코드에서 (minSDKVersion은 3)입니다. [편집 : 추가 SDK 및 API 레벨 정보]

답변

17

내가 , 난 그 타격 할 수 AsyncTask를이 시간에 대기열에있을 수있는 작업의 수에 제한이 있음을 어딘가에 읽고 기억합니다. 이 술집이 들어 있었습니까?

AsyncTask 10 개 스레드와 다른 아무것도 AsyncTask을 사용하지 않는 경우 ... 20 개 항목 단지를 지원하는 것이 이론적으로 (10)의 작업 대기열 깊이를, 현재를 지원하기 위해 나타납니다.

한계를 늘릴 수있는 방법이 있습니까?

소스 코드를 가져 와서 수정하고 자신의 패키지에 넣은 다음 사용하십시오. 내 AsyncTaskEx으로이 작업을 수행했지만 Android 1.5 소스를 기반으로합니다.

이것을 무시하는 것이 안전합니까? ?

작업이 실행 대기열에 저장되지 않습니다. 그것이 "안전"한지 여부는 당신에게 달려 있습니다. 나는 AsyncTask 인프라에 대한 다른 영향을 알지 못합니다.

+0

답장을 보내 주셔서 감사합니다. 코드를 공유해 주셔서 감사합니다. BTW, Romain Guy의 설명은 http://stackoverflow.com/questions/990948/simple-thread-management-java-android입니다. 한도가 완화 된 것처럼 보입니다. – Samuh

+0

불행히도, 나는 그의 진술을 확인할 수 없다. 위의 내용은 Google 코드 검색을 통해 발견 된 소스 코드를 조사한 것입니다. 그것은 내가 코드를 오해 할 수 있습니다. – CommonsWare

+0

동일한 문제가 발생합니다. 필자는 병렬 작업이 아닌 순차적으로 작업을 수행하게되어 매우 기쁩니다. 이것을 할 수있는 방법이 있습니까? 아니면 작업 대기열을 구현할 것인가? –

1

"안전"무시 - 실행 후 수행하려는 모든 종류의 알림이 오류를 catch 할 때 여기에서 수행되어야합니다. 그렇지 않으면 다른 사람 코드는이 작업을 다시 듣는 것에 대한 가정을합니다.

7

응용 프로그램에서 이와 똑같은 일을했습니다.

서버에서 미리보기 이미지를 다운로드하고 데이터 어댑터로 밀어 넣기 위해 한꺼번에 20 개의 병렬 스레드를 실행하면 나에게 좋은 생각이 들리지 않습니다. 모든 스레드는 서로 온통 여행 할 것이고 서로의 길을 얻을 것입니다.

대신 하나의 스레드 만 실행하고 루프에서 축소판을 수집 한 다음 도착시 어댑터에 추가하십시오.

2

AsyncTask.executeOnExecutor와 함께 직렬 실행 프로그램을 사용하여 작업을 직렬화 할 수 있지만 그 작업은 한 번에 하나의 동시 작업으로 제한됩니다. 축소판을 가져올 때 좋을 수도 있습니다.

myAsyncTask.executeOnExecutor (MyAsyncTask.SERIAL_EXECUTOR, [params]);

2

문제는 큐가 새로운 AsyncTasks가 대기 할 수 없습니다 채워지면 AsyncTask.THREAD_POOL_EXECUTOR에 대한 AsyncTasks 보류 의 수는 128 점이다. AsyncTask를 소스 코드에서

:

private static final BlockingQueue<Runnable> sPoolWorkQueue = 
     new LinkedBlockingQueue<Runnable>(128); 

제 생각에는 그 제한은 전혀 전혀 의미가없고 AsyncTask.SERIAL_EXECUTOR 무제한 큐가 있습니다.