안드로이드의 Asynctask vs Thread


135

UI에서 백그라운드 작업을 수행하기 위해 별도의을 사용했습니다 Thread. 그러나 다른 사람들이 제안한대로 지금은을 사용하고 AsyncTask있습니다.

a Thread와 a의 주요 차이점은 무엇입니까 AsyncTask?

어떤 시나리오에서 a Thread또는 AsyncTask?를 사용해야 합니까?


4
JavaDM

@ webaldo.at 내가 이것을 암시했다. 여기에서 Asynctask와 Thread의 설명과 차이점을 입력했다. 네트워크 연결, 예를 들어 내가 사용한 것에 대한 파일 읽기와 같은 경우를 알고 싶다.
Ram

단축 : 스레드-> UI 스레드에 대한 액세스 권한 없음 || Asynctask-> UI 스레드에 대한 조건부 액세스
JavaDM

백그라운드 작업의 경우 IntentService는 또 다른 좋은 옵션입니다.
Chen

답변:


146

장시간 실행되거나 CPU를 많이 사용하는 작업의 경우 기본적으로 Java 스레드와 Android의 기본 AsyncTask의 두 가지 방법이 있습니다.

둘 중 하나가 반드시 다른 것보다 낫지는 않지만 각 호출을 언제 사용해야하는지 아는 것은 시스템 성능을 귀하의 이익으로 활용하는 데 필수적입니다.

다음에 AsyncTask를 사용하십시오.

  1. 많은 데이터를 다운로드 할 필요가없는 간단한 네트워크 작업
  2. 몇 밀리 초 이상 걸릴 수있는 디스크 바운드 작업

다음에 Java 스레드를 사용하십시오.

  1. 중간 또는 많은 양의 데이터가 포함 된 네트워크 작업 (업로드 또는 다운로드)
  2. 백그라운드에서 실행해야하는 높은 CPU 작업
  3. GUI 스레드와 관련된 CPU 사용량을 제어하려는 모든 작업

그리고 인터넷을 통해 도움이 될만한 많은 좋은 자료가 있습니다.

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


다운로드 데이터 양이 왜 문제가 될 수 있습니까?
Yeung

1
@Yeung Async Task에 대한 통찰력이 필요한 것 같습니다! 데이터 양이 클수록 동일한 작업을 완료하는 데 걸린 시간이 분명히 더 큽니다. 따라서 다음과 같은 이유로 비동기 작업을 사용하여 장기 실행 프로세스를 수행하는 것은 좋지 않습니다. 1. 비동기 작업이 활동 수명주기와 제대로 연결되어 있지 않습니다. 2. 그들은 메모 유출을 만듭니다.
Mohit


감사합니다. 나는 지금 위험을 이해합니다.
Yeung

@Impasse @Yeung IMO 데이터 양은 문제가 아니며 네트워크 운영의 주요 문제는 작업 시간입니다. 서버가 사용 중이거나 도달 할 수없는 경우 (타임 아웃) 몇 바이트를 다운로드하더라도 시간이 오래 걸릴 수 있습니다. 수정 프로그램은 AsyncTask자체 스케줄러와 함께 사용할 수 있습니다 .
xmedeko

44

Java 스레드를 사용하는 경우 고유 코드에서 다음 요구 사항을 처리해야합니다.

사용자 인터페이스에 결과를 다시 게시하면 기본 스레드와 동기화

스레드를 취소하기위한 기본값이 없습니다.

기본 스레드 풀링 없음

Android에서 구성 변경을 처리하기위한 기본값이 없습니다.


3
이것은 단순한 스레드를 사용하지 않는 이유를 다루기 때문에 실제로 더 명확합니다. 내 마음의 맨 위에서, 활동 / 서비스 라이프 사이클에 연결해야하는 모든 작업은 AsyncTask를 대신 사용해야합니다. 비록 작업 내부의 자원을 수동으로 "정상적으로 저하"해야하지만 최소한 작업이 중단되는 것은 아닙니다. 활동이 종료 될 때
leRobot

28

  • 일반적으로 긴 작업
  • thread.start () 메소드에 의해 호출
  • 모든 스레드 에서 트리거
  • 자체 스레드 에서 실행
  • 수동 스레드 관리 / 코드를 읽기 어려울 수 있습니다

비동기 작업

  • 메인 스레드와 통신해야하는 작은 작업
  • excute () 메소드로 호출
  • 메인 스레드 에서 트리거
  • 작업자 스레드에서 실행
  • 메인 스레드에서 실행하고 생성해야합니다

11

스레드는 동시 실행 단위입니다. 자체 호출 스택이 있습니다. 응용 프로그램에서 스레드를 구현하는 방법에는 두 가지가 있습니다.

하나는 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 스레드 인 경우 사용하십시오.

핸들러를 조작 할 필요가 없습니다.

자세한 내용은 여기를 방문하십시오


2

실:

Thread성능을 향상 시키려면 장기 실행 조작을 기본 스레드에서 분리하는 데 사용해야합니다. 그러나 우아하게 취소 할 수 없으며 Android의 구성 변경을 처리 할 수 ​​없습니다. 에서 UI를 업데이트 할 수 없습니다 Thread.

AsyncTask5ms보다 짧은 작업 항목을 처리하는 데 사용할 수 있습니다. 를 사용하면 AsyncTaskjava와 달리 UI를 업데이트 할 수 있습니다 Thread. 그러나 많은 장기 실행 작업이 성능을 방해합니다.

둘 다에 대한 대안이 더 적습니다.

HandlerThread / 핸들러ThreadPoolExecutor

자세한 내용은 아래 게시물을 참조하십시오.

처리기 대 AsyncTask 대 스레드

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.