[android] AsyncTask 스레드는 절대 죽지 않습니다.
AsyncTask
사용자가 버튼을 누르는 것에 대한 응답으로 데이터를 가져 오기 위해 s를 사용 하고 있습니다. 이것은 잘 작동하고 데이터를 가져 오는 동안 인터페이스의 응답 성을 유지하지만 이클립스 디버거에서 무슨 일이 일어나고 있는지 확인할 때마다 새 파일 AsyncTask
이 생성 될 때마다 (한 번만 사용할 수 있기 때문에 자주 발생 함) ), 새 스레드가 생성되었지만 종료되지 않았습니다.
그 결과 많은 수의 AsyncTask
스레드가 그대로 있습니다. 이것이 실제로 문제인지 아닌지는 확실하지 않지만 추가 스레드를 제거하고 싶습니다.
이 스레드를 어떻게 죽일 수 있습니까?
답변
AsyncTask
로 생성 된 스레드 풀을 관리합니다 ThreadPoolExecutor
. 5 ~ 128 개의 스레드가 있습니다. 5 개 이상의 스레드가있는 경우 추가 스레드는 제거되기 전에 최대 10 초 동안 붙어 있습니다. (참고 :이 수치는 현재 볼 수있는 오픈 소스 코드에 대한 것이며 Android 릴리스에 따라 다릅니다).
AsyncTask
실은 그대로 두세요 .
답변
CommonsWare의 응답에 추가하여 :
현재 저는 Android 2.2를 사용하고 있으며 내 애플리케이션은 한 번에 하나 이상의 AsyncTask를 사용하지 않지만 x 분마다 새 작업을 만듭니다. 처음에는 새 AsyncTask 스레드가 나타나기 시작하지만 (새 AsyncTask에 대한 새 스레드) 5 개 스레드 (CommonsWare에서 언급했듯이) 후에는 디버그 창에 계속 표시되고 새 AsyncTask 스레드가 필요할 때 다시 사용됩니다. 디버거가 연결이 끊어 질 때까지 그대로 유지됩니다.
답변
여기에도 같은 증상이 있습니다. 제 경우에는 활동을 죽인 후 스레드가 매달려 있었고 앱이 완전히 닫히기를 바랐습니다. 단일 스레드 실행기를 사용하여 부분적으로 해결 된 문제 :
myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());
이로 인해 작업이 완료된 후 실이 사라졌습니다.
답변
ThreadPoolExecutor를 사용하십시오 .
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
execute () 메서드 Runnable
를 사용 하여 작업을 게시하십시오 .
void execute (Runnable command)
미래에 주어진 작업을 실행합니다. 작업은 새 스레드 또는 기존 풀링 된 스레드에서 실행될 수 있습니다.
두 번째 쿼리와 관련하여 :
이 스레드를 어떻게 죽일 수 있습니까?
을 (를) 사용한 모든 작업이 끝나면 ThreadPoolExecutor
아래 게시물에 인용 된대로 제대로 종료하십시오.