UI에서 백그라운드 작업을 수행하기 위해 별도의을 사용했습니다 Thread
. 그러나 다른 사람들이 제안한대로 지금은을 사용하고 AsyncTask
있습니다.
a Thread
와 a의 주요 차이점은 무엇입니까 AsyncTask
?
어떤 시나리오에서 a Thread
또는 AsyncTask
?를 사용해야 합니까?
UI에서 백그라운드 작업을 수행하기 위해 별도의을 사용했습니다 Thread
. 그러나 다른 사람들이 제안한대로 지금은을 사용하고 AsyncTask
있습니다.
a Thread
와 a의 주요 차이점은 무엇입니까 AsyncTask
?
어떤 시나리오에서 a Thread
또는 AsyncTask
?를 사용해야 합니까?
답변:
장시간 실행되거나 CPU를 많이 사용하는 작업의 경우 기본적으로 Java 스레드와 Android의 기본 AsyncTask의 두 가지 방법이 있습니다.
둘 중 하나가 반드시 다른 것보다 낫지는 않지만 각 호출을 언제 사용해야하는지 아는 것은 시스템 성능을 귀하의 이익으로 활용하는 데 필수적입니다.
다음에 AsyncTask를 사용하십시오.
다음에 Java 스레드를 사용하십시오.
그리고 인터넷을 통해 도움이 될만한 많은 좋은 자료가 있습니다.
http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
AsyncTask
자체 스케줄러와 함께 사용할 수 있습니다 .
Java 스레드를 사용하는 경우 고유 코드에서 다음 요구 사항을 처리해야합니다.
사용자 인터페이스에 결과를 다시 게시하면 기본 스레드와 동기화
스레드를 취소하기위한 기본값이 없습니다.
기본 스레드 풀링 없음
Android에서 구성 변경을 처리하기위한 기본값이 없습니다.
실
스레드는 동시 실행 단위입니다. 자체 호출 스택이 있습니다. 응용 프로그램에서 스레드를 구현하는 방법에는 두 가지가 있습니다.
하나는 Thread를 확장하고 run () 메소드를 재정의하는 새로운 클래스를 제공하는 것입니다. 다른 하나는 생성하는 동안 Runnable 객체를 사용하여 새 Thread 인스턴스를 제공하는 것입니다. "start"메소드를 호출하여 스레드를 실행할 수 있습니다. "setPriority (int)"메소드를 호출하여 스레드의 "우선 순위"를 설정할 수 있습니다.
UI 부분에 영향을 미치지 않으면 스레드를 사용할 수 있습니다. 예를 들어, 일부 웹 서비스를 호출하거나 일부 데이터를 다운로드하고 있으며 다운로드 후 화면에 표시합니다. 그런 다음 스레드와 함께 처리기를 사용해야하며 스레드의 모든 응답을 처리하기 위해 응용 프로그램을 복잡하게 만듭니다.
핸들러를 사용하면 스레드의 MessageQueue와 관련된 Message 및 Runnable 객체를 보내고 처리 할 수 있습니다. 각 스레드에는 각 메시지 큐가 있습니다. (할 일 목록처럼) 스레드는 각 메시지를 가져 와서 메시지 큐가 비워 질 때까지 처리합니다. 따라서 Handler가 통신 할 때 호출자 스레드에 메시지를 제공하기 만하면 처리를 기다립니다.
Java 스레드를 사용하는 경우 고유 코드에서 다음 요구 사항을 처리해야합니다.
사용자 인터페이스에 결과를 다시 게시 할 경우 기본 스레드와 동기화 스레드를 취소하기위한 기본값 없음 기본 스레드 풀링 없음 Android에서 구성 변경 사항을 처리하기위한 기본값 없음
비동기 작업
AsyncTask를 사용하면 UI 스레드를 적절하고 쉽게 사용할 수 있습니다. 이 클래스를 사용하면 스레드 및 / 또는 핸들러를 조작하지 않고도 UI 스레드에서 백그라운드 작업을 수행하고 결과를 게시 할 수 있습니다. 비동기 작업은 백그라운드 스레드에서 실행되고 결과가 UI 스레드에 게시되는 계산에 의해 정의됩니다.
AsyncTask는 다음 4 단계를 거칩니다.
onPreExecute ()
작업이 실행되기 전에 UI 스레드에서 호출
doInbackground (파라 마 ..)
onPreExecute () 실행이 완료된 직후 백그라운드 스레드에서 호출됩니다.
onProgressUpdate (진행 ..)
publishProgress (Progress ...)를 호출 한 후 UI 스레드에서 호출됩니다.
onPostExecute (결과)
백그라운드 계산이 완료된 후 UI 스레드에서 호출됩니다.
왜 AsyncTask를 사용해야합니까?
UI 스레드에 사용하기 쉽습니다. 따라서 호출자 스레드가 UI 스레드 인 경우 사용하십시오.
핸들러를 조작 할 필요가 없습니다.
자세한 내용은 여기를 방문하십시오
실:
Thread
성능을 향상 시키려면 장기 실행 조작을 기본 스레드에서 분리하는 데 사용해야합니다. 그러나 우아하게 취소 할 수 없으며 Android의 구성 변경을 처리 할 수 없습니다. 에서 UI를 업데이트 할 수 없습니다 Thread
.
AsyncTask
5ms보다 짧은 작업 항목을 처리하는 데 사용할 수 있습니다. 를 사용하면 AsyncTask
java와 달리 UI를 업데이트 할 수 있습니다 Thread
. 그러나 많은 장기 실행 작업이 성능을 방해합니다.
둘 다에 대한 대안이 더 적습니다.
HandlerThread / 핸들러 및 ThreadPoolExecutor
자세한 내용은 아래 게시물을 참조하십시오.