2013-06-11 4 views
0

저는 Android 토런트 앱에서 작업하고 있으며 동시에 여러 급류를 다운로드 할 수 있어야합니다. 나는 그것을하고있는 다른 응용을 보았다. 토런트 안드로이드 앱에서 10 가지 이상의 토렌트를 동시에 다운로드 할 수 있습니다. 현재 비동기 작업이있는 서비스를 사용하고 있지만 동시에 5 개 이상을 실행할 수는 없습니다 (Running multiple AsyncTasks at the same time -- not possible?). 이것이 어떻게 이루어질 수 있는지에 대한 아이디어가 있습니까?android에서 여러 다운로드를 시작하는 방법

답변

0

모든 AsyncTasks 공유 정적 및 LinkedBlockingQueue 등 ThreadPoolExecutor에 의해 내부적으로 제어된다. AsyncTask에서 execute를 호출하면 ThreadPoolExecutor는 나중에 일정 시간이 지나면 실행할 수 있습니다.

'언제 내가 준비 되나요?' ThreadPoolExecutor의 동작은 코어 풀 크기와 최대 풀 크기의 두 매개 변수로 제어됩니다. 현재 코어 풀 크기보다 작은 스레드가 현재 활성 상태이고 새 작업이 들어 오면 실행 프로그램은 새 스레드를 작성하고 즉시 실행합니다. 실행중인 코어 풀 크기의 스레드가 적어도 있으면 작업 대기열에 넣고 사용 가능한 유휴 스레드 (즉, 다른 작업이 완료 될 때까지)가 될 때까지 대기합니다. 작업을 대기열에 넣을 수없는 경우 (대기열은 최대 용량을 가질 수 있음) 작업이 실행될 수 있도록 새 스레드 (최대 풀 크기 스레드까지)를 생성합니다. 비 핵심 유휴 스레드는 결국 연결 유지 제한 시간 매개 변수

안드로이드 1.6 이전에는 코어 풀 크기가 1이고 최대 풀 크기는 10이었습니다. 안드로이드 1.6 이후 코어 공극 크기는 5이고 최대 풀 크기는 128입니다. 대기열 크기는 둘 다 10입니다 사례. keep-alive timeout은 2.3 초 전에 10 초 였고 그 이후로 1 초가되었습니다.

이 모든 것을 염두에두고 AsyncTask가 5/6의 작업 만 실행하는 것처럼 보이는 이유가 이제 명확 해졌습니다. 6 번째 작업은 다른 작업 중 하나가 완료 될 때까지 대기열에 있습니다. 이것은 장기 실행 작업에 AsyncTasks를 사용하지 않아야하는 매우 좋은 이유입니다. 다른 AsyncTask가 실행되는 것을 방지합니다.

완전성을 위해 6 가지가 넘는 작업 (예 : 30 개)으로 연습을 반복하면 대기열이 가득 차고 실행 프로그램이 푸시되어 더 많은 작업자 스레드를 만들면 6 개 이상이 doInBackground에 들어갑니다. 장기 실행 작업을 계속 수행했다면 20/30이 활성 상태가되고 대기열에 10이 계속 남아 있어야합니다.

+0

위대한 답변을 주셔서 감사합니다. "장기 실행 작업에 AsyncTasks를 사용하지 않아야하는 이유는 아주 좋습니다. 여러 (장기간) 다운로드를 시작하는 데 사용할 수있는 다른 솔루션을 알고 있습니까? –

+0

여러 가지 방법이 있습니다. http://developer.android.com/training/multiple-threads/create-threadpool.html API 레벨 9의 MultiThreading 메소드를 살펴볼 수 있습니다. DownloadManager가 있습니다. http://developer.android .com/reference/android/app/DownloadManager.html. 또한 Threads ThreadingPool 및 Locks를 사용하여 자신 만의 버전을 구현할 수 있습니다 ... –

-1

왜 Android Download Manager를 사용하지 않습니까? 어떻게 다운로드를 관리하는지 모르지만 동시에 많은 파일을 다운로드하는 것처럼 보입니다.

Android Download Manager

+0

토런트는 http 다운로드하지 않습니다. 문서에서 : "다운로드 관리자는 장기 실행 HTTP 다운로드를 처리하는 시스템 서비스입니다." –

+0

맞아. 죄송합니다. 급류를 다운로드하는 것에 관해서는 아무것도 알지 못했습니다. – osayilgan

관련 문제