Programing

AsyncTask 스레드는 절대 죽지 않습니다

crosscheck 2020. 7. 27. 07:32
반응형

AsyncTask 스레드는 절대 죽지 않습니다


AsyncTask사용자가 버튼을 누를 때 s를 사용하여 데이터를 가져옵니다. 이것은 잘 작동하고 데이터를 가져 오는 동안 인터페이스 응답 성을 유지하지만 Eclipse 디버거에서 진행중인 작업을 확인했을 때 새로운 것을 만들 때마다 AsyncTask한 번만 사용할 수 있다는 것을 알았습니다. ), 새 스레드가 작성되었지만 종료되지 않았습니다.

결과적으로 AsyncTask거기에 많은 스레드가 있습니다. 이것이 실제로 문제인지 여부는 확실하지 않지만 추가 스레드를 제거하고 싶습니다.

이 스레드를 어떻게 죽일 수 있습니까?


AsyncTask로 작성된 스레드 풀을 관리합니다 ThreadPoolExecutor. 스레드는 5-128 개입니다. 스레드가 5 개 이상인 경우 해당 추가 스레드는 제거하기 전에 최대 10 초 동안 고정됩니다. (참고 :이 수치는 현재 공개되는 오픈 소스 코드에 대한 것이며 Android 릴리스에 따라 다릅니다).

AsyncTask실을 그대로 두십시오 .


CommonsWare의 응답 외에도 :

현재 Android 2.2를 사용하고 있으며 내 응용 프로그램은 언제든지 하나 이상의 AsyncTask를 사용하지만 x 분마다 새로운 AsyncTask를 만듭니다. 처음에는 새로운 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를 올바르게 종료하는 방법

참고 URL : https://stackoverflow.com/questions/3077461/asynctask-threads-never-die

반응형