내 애플리케이션에 AsyncTask 또는 IntentService를 사용해야합니까?
나는 안드로이드와 인터넷 연결에 주위를 읽고이 예를 처리하는 여러 가지 방법이 있습니다 발견되었다 AsyncTask
하고 IntentService
. 그러나 나는 여전히 어떤 것을 사용 해야할지 모르겠습니다. 내 응용 프로그램은 기본적으로 Google지도의 위치 / 트레일 찾기입니다. 내 인터넷 연결은지도의 특정 반경 내에서 가장 가까운 트레일을 찾는 데 사용됩니다. 따라서 사용자가지도를 새 위치로 이동하거나 스 와이프 할 때마다 가장 가까운 트레일로 업데이트됩니다. 또한 새로운 트레일을 추가하고 사용자가 트레일을 평가할 수 있습니다.
윌 AsyncTask
이 충분하거나 사용해야합니까 IntentService
?
AsyncTask
현재 수행하려는 작업과 같이 활동과 밀접한 관련이있는 짧고 반복적 인 작업에는를 사용해야합니다 . IntentService
활동과 관계없이 백그라운드에서 실행되어야하는 예약 된 작업 (반복적이든 아니든)에 더 적합합니다.
용도에 따라 매우 다르게 사용할 수 있습니다.
AsyncTask
사용자에게 지속적으로 무언가를 알려주거나 주기적으로 메인 스레드에서 작업을 수행해야하는 경우 사용할 수있는 편리한 스레딩 유틸리티입니다. 그것은 많은 세밀한 제어를 제공하며, 그 특성 때문에 일반적으로 또는 프레임 워크를 사용해야 하는 Activity
반면에서는 작업하기가 매우 쉽습니다 .IntentService
BroadcastReceiver
IBinder
IntentService
는와 매우 유사하게 사용할 수 AsyncTask
있지만, 그 목적은 사용자 상호 작용이나 메인 스레드가 필요없는 백그라운드 다운로드, 업로드 또는 기타 차단 작업을위한 것입니다. 예를 들어지도를 다운로드하고 캐시하려면를 호출 IntentService
하여 사용자가 다운로드를 위해 앱을 볼 필요가 없도록 할 수 있습니다. 마찬가지로 서버로 데이터를 보내는 경우 IntentService
시작하고 잊을 수 있으므로 이와 관련하여 매우 유용합니다. 사용자는 앱에 댓글을 입력 한 다음 "보내기"를 누를 수 있습니다. "보내기"는 IntentService
주석을 받고 백그라운드 스레드에서 서버로 보내는를 시작합니다. 사용자는 "보내기"를 누르고 즉시 앱에서 나갈 수 있으며 댓글은 결국 여전히 서버에 도달합니다 (물론 오류가 없다고 가정). 당신이 이것을 한 경우AsyncTask
당신에 Activity
에 한편, 시스템은 교환의 중간에 프로세스를 죽일 수 있으며 또는-수 있습니다 통과하지.
일반적으로 둘 다 장기 실행 응용 프로그램을위한 것은 아닙니다. 짧은 일회성 작업을위한 것입니다. 영구적이거나 장기적인 작업에 사용할 수 있지만 권장되지는 않습니다.
AsyncTask는 구성 변경 또는 활동을 다시 시작하는 기타 항목과 잘 작동하지 않습니다.
IntentService는 작업을 수행하는 데 걸리는 시간에 관계없이 항상 사용할 수 있어야하는 항목에 적합합니다. AsyncTask는 활동 상태에 훨씬 더 많이 의존하기 때문에 대부분의 경우 IntentService를 선호합니다.
몇 가지 참고 사항 :
- AsyncTask는 UI로 바로 돌아 가야하는 빠른 작업에 가장 적합하지만 다양한 상황에서 사용할 수 있습니다.
- "주기적으로 메인 스레드에서 작업을 수행한다"는 말은 모호합니다. AsyncTask 는 기본 스레드와 다른 새 백그라운드 스레드를 생성하고 새 스레드 에서 작업을 수행합니다. 따라서 이름 AsyncTask.
- IntentService는 BroadcastReceiver 프레임 워크를 "조작"할 필요가 없습니다. 로컬 브로드 캐스트 인 텐트를 전송하고 활동에서이를 감지하기 만하면됩니다. 이것이 AsyncTask보다 더 어려운지 모르겠습니다.
- IntentService 는 백그라운드 에서 수행되는 장기 실행 작업을 수행하기위한 것입니다.
- AsyncTaskLoader는 사용할 수 있지만 CursorLoader 등의 기본 클래스입니다. 사용자가 새 위치로 이동할 때 "근처"트레일을 새로 고치려면 IntentService가 더 좋습니다.
위치를 업데이트하기 전에 연결을 확인하는 것을 잊지 마십시오.
AsyncTasks는 활동에 매우 밀접하게 연결되어 있으며 AsyncTask를 생성 한 활동에서 벗어나면 창 유출 오류가 발생할 수 있습니다. 그러나 진행률을 빠르게 업데이트 할 수 있으므로 ProgressBar를 표시하는 데 유용합니다.
IntentServices는 더 깨끗하고 안전합니다. 초보 Android 개발자 일 때는 구현하기가 더 어렵지만 일단 시작하고 처리하는 방법을 배우면 AsyncTasks로 돌아 가지 않을 것입니다!
IntentServices는 또한 앱에서보다 모듈화 된 디자인을 허용합니다. 일반적으로 모든 IntentServices에 대해 별도의 클래스를 생성하지만 AsyncTasks의 경우 Activity 내부 클래스로 생성합니다. AsyncTask를 Activity에서 분리하려면 AsyncTask 생성자에서 Activity Context 및 View 개체를 전달해야합니다.
위에서 언급했듯이 AsyncTask
문제가 해결됩니다.
그러나 여기 AsyncTask
에는 중요한 약점이 있습니다. Activity
"새로 고침"을 제대로 처리하지 못합니다 (예 : 회전 중). 예를 들어 사용자 AsyncTask
가 여전히 물건을로드 하는 동안 휴대 전화를 회전하면 문제가 될 수 있습니다 . 이것이 실제로 문제라면 다음을 권장합니다 AsyncTaskLoader
.
http://developer.android.com/reference/android/content/AsyncTaskLoader.html
AsyncTask
그리고 IntentService
같은 많은
- 작업자 스레드에서 작업을 실행할 수 있습니다.
- 백그라운드에서 실행 가능
- 작업이 끝날 때까지 계속 실행하십시오.
- 작업 실행 중 또는 작업 완료 후 UI 업데이트 알림 가능
- 들어
AsyncTask
우리가 자주 사용하는onProgressUpdate
,onPostExecute
또는 당신이 원하는 경우에 당신은 사용할 수 있습니다BroadcastReceiver
- 들어
IntentService
우리가 사용하는BroadcastReceiver
- 들어
다른
1) 실행 중 또는 실행 완료 후 작업 보내기
작업의 예는 다음과 같습니다 fileName
. 서버 기반에서 .
사용 AsyncTask
의 인스턴스가 하나이면 AsyncTask
파일 A를 다운로드하는 동안 다운로드 파일 B를 실행할 수 없습니다AsyncTask
(를 얻었 으므로java.lang.IllegalStateException: Cannot execute task: the task is already running.
). 우리가 얻을 수 있기 때문에 또한 파일 A가 완료 다운로드 후, 우리는 다운로드 파일 B를 실행할 수 없습니다 ( java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
.
중 또는 다운로드 파일 A 후 파일 B를 다운로드하려면, 우리의 새로운 인스턴스를 작성해야합니다 AsyncTask
.
=> 다운로드 파일 A와 파일 B에, 우리가 필요로하는 2 인스턴스 AsyncTask
=> 2 작업자 스레드 생성
사용 IntentService
파일 A를 다운로드하는 동안 파일 B를 다운로드하도록 인 텐트를 보낼 수 있습니다. => 파일 A 다운로드가 완료되면 자동으로 다운로드 파일 B가 시작됩니다. => 새 인스턴스가 필요하지 않습니다. 새 작업자 스레드가 필요하지 않습니다.
If we sent intent to download file B after download file A finished? After download file A finished, IntentSevice will destroyed (because there is no more task). Therefore, when start download file B, new instance of Service
is created however no new thread created (service keep using only 1 worker thread which name is defined in IntentSevice
constructor
2) Implement AsyncTask
is easier than IntentService
USING
We will see that AsyncTask
and IntentService
have many same so in most case we can use AsyncTask
or IntentService
. However
- I often use
AsyncTask
for some task that start, finish, interact with UI in 1Activity
- I often use
IntentService
for some task that can start/finish and interact or don't interact with UI from anyActivity
This answer is base on my test. Please correct me if I am wrong. Hope it help.
In short, AsyncTask is meant for short tasks that have to communicate with main thread. IntentService is meant for long tasks that don't have to communicate with main thread.
For more info, check these links
http://www.onsandroid.com/2011/12/difference-between-android.html
https://medium.com/@skidanolegs/asynctask-vs-intentservice-1-example-without-code-5250bea6bdae
https://android.jlelse.eu/using-intentservice-vs-asynctask-in-android-2fec1b853ff4
I agree with @DeeV and @ebarrenechea about Intent service in part that you should use it for task that are not tight bound with Activity like uploading some data to server or storing data from server to database.
But starting from Android 3.0 there were introduced Loaders API Which should replace AsyncTask. So for example for loading list which you should display in Activity is better to use Loader which is designed to handle well all the configuration changes and Activity Life-cycle.
ReferenceURL : https://stackoverflow.com/questions/15167152/should-i-use-asynctask-or-intentservice-for-my-application
'programing' 카테고리의 다른 글
Tomcat의 PermGen 공간 오류 (0) | 2021.01.17 |
---|---|
다른 테이블 값을 기반으로하는 MySQL 업데이트 테이블 (0) | 2021.01.17 |
.net 사용자 지정 구성 enum ConfigurationProperty를 구문 분석하는 대 / 소문자를 구분하지 않는 방법 (0) | 2021.01.16 |
Datatables 경고 (table id = 'example') : 데이터 테이블을 다시 초기화 할 수 없습니다. (0) | 2021.01.16 |
envsubst : Mac OS X 10.8에서 명령을 찾을 수 없음 (0) | 2021.01.16 |