[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아래 게시물에 인용 된대로 제대로 종료하십시오.

Java ExecutorService를 올바르게 종료하는 방법


답변