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
'Programing' 카테고리의 다른 글
| JSDoc : 객체 구조 반환 (0) | 2020.07.27 |
|---|---|
| CKEditor와 커스텀 파일 브라우저 / 업 로더를 어떻게 통합 할 수 있습니까? (0) | 2020.07.27 |
| 클래스 이름에 "this"사용 (0) | 2020.07.27 |
| ggplot을 사용하여 축의 숫자 형식을 어떻게 변경합니까? (0) | 2020.07.27 |
| android에서 adjustResize와 adjustPan의 차이점은 무엇입니까? (0) | 2020.07.27 |