AsyncTask <arg1, arg2, arg3>에 전달되는 인수는 무엇입니까?


161

내가 여기에 무엇을 넣어야하는지 그리고이 논쟁이 어디에서 끝나는 지 이해할 수 없습니까? 정확히 무엇을 입력해야하며 정확히 어디로 가야합니까? 3 개를 모두 포함해야합니까, 아니면 1,2,20 개를 포함 할 수 있습니까?

답변:


501

Google의 Android 문서에 따르면 다음과 같습니다.

비동기 작업은 Params, Progress 및 Result라는 3 가지 일반 유형과 onPreExecute, doInBackground, onProgressUpdate 및 onPostExecute라는 4 단계로 정의됩니다.

AsyncTask의 일반 유형 :

비동기 작업에 사용되는 세 가지 유형은 다음과 같습니다.

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

모든 유형이 항상 비동기 작업에서 사용되는 것은 아닙니다. 유형을 미사용으로 표시하려면 Void 유형을 사용하십시오.

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

추가로 참조 할 수 있습니다 : http://developer.android.com/reference/android/os/AsyncTask.html

또는 Sankar-Ganesh의 블로그를 참조하여 AsyncTask의 역할을 지울 수 있습니다.

일반적인 AsyncTask 클래스의 구조는 다음과 같습니다.

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

이 메서드는 새 스레드를 시작하기 전에 실행됩니다. 입력 / 출력 값이 없으므로 변수 또는 필요한 작업을 초기화하면됩니다.

    protected Z doInBackground(X...x){

    }

AsyncTask 클래스에서 가장 중요한 메서드입니다. 백그라운드에서하고 싶은 모든 작업을 메인 스레드와 다른 스레드에 배치해야합니다. 여기에 입력 값으로 "X"유형의 객체 배열이 있고 (헤더에 표시됩니까? "... extends AsyncTask"가 있습니다. 입력 매개 변수의 TYPES입니다) 유형에서 객체를 반환합니다. "지".

   protected void onProgressUpdate(Y y){

   }

이 메서드는 publishProgress (y) 메서드를 사용하여 호출되며 일반적으로 백그라운드에서 수행중인 작업의 진행률을 표시하는 진행률 표시 줄과 같이 기본 화면에 진행률이나 정보를 표시하려는 경우에 사용됩니다.

  protected void onPostExecute(Z z){

  }

이 메서드는 백그라운드에서 작업이 완료된 후에 호출됩니다. 입력 매개 변수로 doInBackground 메소드의 출력 매개 변수를 수신합니다.

X, Y 및 Z 유형은 어떻습니까?

위의 구조에서 추론 할 수 있습니다.

 X – The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y – The type of the objects you are going to enter in the onProgressUpdate method.

 Z – The type of the result from the operations you have done in the background process.

외부 클래스에서이 작업을 어떻게 호출합니까? 다음 두 줄만 사용하면됩니다.

MyTask myTask = new MyTask();

myTask.execute(x);

여기서 x는 X 유형의 입력 매개 변수입니다.

작업이 실행되면 "외부"에서 상태를 확인할 수 있습니다. "getStatus ()"메소드 사용.

 myTask.getStatus();

다음 상태를받을 수 있습니다.

RUNNING- 작업이 실행 중임을 나타냅니다.

PENDING- 작업이 아직 실행되지 않았 음을 나타냅니다.

FINISHED -onPostExecute (Z)가 완료되었음을 나타냅니다.

AsyncTask 사용에 대한 힌트

  1. onPreExecute, doInBackground 및 onPostExecute 메소드를 수동으로 호출하지 마십시오. 이것은 시스템에 의해 자동으로 수행됩니다.

  2. 다른 AsyncTask 또는 Thread 내에서 AsyncTask를 호출 할 수 없습니다. 메소드 execute의 호출은 UI 스레드에서 수행되어야합니다.

  3. onPostExecute 메서드는 UI 스레드에서 실행됩니다 (여기서는 다른 AsyncTask를 호출 할 수 있습니다!).

  4. 태스크의 입력 매개 변수는 Object 배열이 될 수 있습니다. 이렇게하면 원하는 오브젝트와 유형을 넣을 수 있습니다.


20
완벽한 설명의 친구
Kalai.G

31
Google보다 낫습니다.
Diolor 2014.01.21

25
+1. 회원 여러분, 메모 해주세요. 이것이 당신이 설명하는 방법입니다. 길지만 이해하기 매우 쉽습니다. Kartik 감사합니다.
Subby

3
좋은 설명, 이제 Asyntask에 대해 매우 명확합니다. :) 감사 Kartik
리나

2
그것은 나를 위해 많은 것을 정리했습니다.
Michael

82

나는 파티에 너무 늦었지만 이것이 누군가를 도울 것이라고 생각했습니다.


7
이 비주얼은 매우 도움이되었습니다. 코드 흐름이 간단하지 않거나 기술이나 패턴이 드문 경우 유형과 관련 변수가 어떻게 함께 연결되는지 보여주기 위해 이와 같은 더 많은 시각적 개체를 사용하기 시작합니다. 나는 다른 사람들이 이것을 더 많이하기를 바랍니다. 감사합니다
켄트 Lauridsen은

멋진 비주얼, WeakAsyncTask에도 추가해 주 시겠어요?
kAmol

1
@kAmol 확실히, 나는 또한 흐름을 만들려고 노력할 WeakAsyncTask것입니다
mrid

4
언젠가는 이것을 액자에 넣어 벽에 붙여서 참조를 위해이 스레드로 계속 돌아갈 필요가 없습니다.
Matt Robertson

17

간단하게!

AsyncTask백그라운드 스레드에서 실행 배경 작업입니다. 그것은 얻어 입력을 수행 진전 및 범 출력 .

AsyncTask<Input,Progress,Output>.

제 생각에 혼란의 주된 원인은 AsyncTask.
열쇠는 Do n't memorize 입니다.
작업이 실제로 수행해야하는 작업을 시각화 할 수 있다면 AsyncTask올바른 서명으로 를 작성하는 것은 케이크 조각이 될 것입니다. 입력 , 진행률출력
무엇인지 파악하면 잘 될 것입니다.

예를 들면 : 여기에 이미지 설명 입력

AsyncTask의 핵심!

doInBackgound()방법은 가장 중요한 방법입니다 AsyncTask때문에

  • 이 메서드 만 백그라운드 스레드에서 실행되고 데이터를 UI 스레드에 게시합니다.
  • AsyncTask매개 변수 에 따라 서명이 변경됩니다 .

그럼 관계를 봅시다

여기에 이미지 설명 입력

doInBackground()onPostExecute(), onProgressUpdate()또한 관련되어 있습니다.

여기에 이미지 설명 입력

코드보기
그렇다면 DownloadTask의 코드는 어떻게 작성합니까?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

이 작업을 어떻게 실행 하시겠습니까?

new DownLoadTask().execute("Paradise.mp3");

1
// show in spinner, access UI elementsonProgressUpdate(...):)
Volkan Güven에

5

다음 링크를 참조하십시오.

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

3 개 이상의 인수를 전달할 수 없습니다. 하나의 인수 만 전달하려면 다른 두 인수에 대해 void를 사용하십시오.

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

비동기 작업은 백그라운드 스레드에서 실행되고 그 결과가 UI 스레드에 게시되는 계산에 의해 정의됩니다. 비동기 작업은 Params, Progress 및 Result라는 3 가지 일반 유형과 onPreExecute, doInBackground, onProgressUpdate 및 onPostExecute라는 4 단계로 정의됩니다.

KPBird


3
  • 간단히 말해 AsyncTask에는 3 개의 매개 변수가 있습니다.

    1. DoInBackground (String ... params)에서 입력 사용을위한 매개 변수

    2. OnProgressUpdate (String ... status)에서 진행 상태를 표시하는 매개 변수

    3. OnPostExcute (String ... result)에서 결과 사용을위한 매개 변수

    참고 :-[매개 변수 유형은 요구 사항에 따라 다를 수 있습니다.]

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