will come true

[Android] Google Play services - Task<TResult> 타입 본문

Android

[Android] Google Play services - Task<TResult> 타입

haehyun 2022. 3. 4. 18:34

Task<TResult>

  • 비동기 작업 단위를 나타낸다. (앞으로 'Task'를 '작업'이라고 치환해서 읽어도 된다.)
  • google-services 라이브러리 함수를 사용할 때 함수 매개변수 또는 반환값으로 사용되는 결과 타입.
  • .addOnCompleteListener(onCompleteListener<TResult> listener) 함수등을 통해 해당 Task가 성공했을 시 자동으로 호출될 콜백함수를 지정할 수 있는데, 이 함수의 매개변수가 대부분 Task<T> 타입이다.
  • 작업(Task)의 성공 여부, 발생한 예외, 결과 데이터 등 정보를 가지고 있다.

예시1) Firebase Storage 스토리지 API로 컬렉션을 만들고 문서를 추가하는 코드.
이 때 켈렉션에 문서를 추가하는 CollectionReference.add() 함수의 반환값이 Task<DocumentReference> 이다. DocumentReference를 작업 대상으로 가지는 Task<DocumentReference> 타입인 것이다.

var db: FirebaseFirestore = FirebaseFirestore.getInstance()

val user = mapOf(
    "name" to "alex",
    "email" to "alex@gmail.com",
    "avg" to 10
    )

val colRef: CollectionReference = db.collection("users")
val docRef: Task<DocumentReference> = colRef.add(user)
docRef.addOnSuccessListener { documentReference -> 
    Log.d("result : ", "document id : ${documentReference.id}")
}

 

예시2) Firebase Authentication 인증 API로 회원가입 기능을 구현하는 코드.
FirebaseAuth 객체를 얻은 후 지정한 이메일, 비밀번호로 회원 가입을 하는데, 이 때 회원가입(Task 단위)에 성공했을 시 호출되는 콜백함수의 매개변수가 Task<AuthResult> 타입이다. 이 변수에서 해당 작업의 성공여부(task.isSuccessful), 얻은 결과 데이터(task.result) 등을 추출해 코드에서 사용할 수 있다.

lateinit var auth: FirebaseAuth

auth = Firebase.auth
auth.createUserWithEmailAndPassword("alex@gmail.com", "alex2022")
    .addOnCompleteListener(this) { task: Task<AuthResult> -> 
    	// ...
    }

 

Task 주요 메서드

반환 값 함수 설명
Task<TResult> addOnCanceledListener(OnCanceledListener listener) Task가 취소됐을 때 호출될 리스너를 추가한다.
Task<TResult> addOnCompleteListener(OnCompleteListener<TResult> listener) Task가 완료됐을 때 호출될 리스너를 추가한다.
Task<TResult> addOnCompleteListener(Activity activity, OnCompleteListener<TResult> listener) Task가 완료됐을 때 호출될 액티비티 범위(Activity-scoped) 리스너를 추가한다.
abstract Task<TResult> addOnFailureListener(OnFailureListener listener) Task가 실패했을 때 호출할 리스너를 추가한다.
abstract boolean isSuccessful() Task가 성공적으로 완료되었으면 true, 그렇지 않으면 false를 반환한다.
abstract boolean isComplete() Task가 완료되었으면 true, 그렇지 않으면 false를 반환한다.
abstract boolean isCanceled() Task가 취소되었으면 true, 그렇지 않으면 false를 반환한다.
abstract TResult getResult() Task가 이미 완료된 경우 Task의 결과를 가져온다.
(Task<TResult>의 결과는 TResult 타입)
abstract Exception getException() Task 실패 원인이 된 예외를 반환한다.

 

Task<TResult> 객체로부터 TRsult 타입의 데이터를 추출할 수 있다. 예를 들어 Task<AuthResult> 객체에서 getResult() 함수를 호출하면 반환 값으로 AuthResult 객체를 얻을 수 있다.

Java에서 getter()/setter() 메서드는 Kotlin에서 프로퍼티로 변환되기 때문에 isSuccessful() 메서드는 isSuccessful 프로퍼티로, getResult() 메서드는 result 프로퍼티로 값에 접근한다. 즉, Task<T> 객체의 성공 여부를 얻고 싶을 때, Java에서는 task.isSuccessful() / Kotlin에서는 task.isSuccessful 과 같이 작성하면 된다.

addOnCompleteListener() 와 같은 함수의 경우 *고차함수이고 마지막 전달 인자가 람다함수이기 때문에 소괄호를 생략하고 마지막 매개변수는 { } 중괄호 안에 람다식 형태로 바로 함수몸체를 정의해도 된다. 즉, 아래의 코드는 형태만 다를 뿐 동일한 기능의 코드이다.

lateinit var auth: FirebaseAuth
auth = Firebase.auth
auth.createUserWithEmailAndPassword("alex@gmail.com", "alex2022")
    .addOnCompleteListener(this, { task ->
        // ...
    })
lateinit var auth: FirebaseAuth
auth = Firebase.auth
auth.createUserWithEmailAndPassword("alex@gmail.com", "alex2022")
    .addOnCompleteListener(this) { task -> 
    	// ...
    }

 

*고차함수(high order function) : 함수를 매개변수로 전달받거나 반환하는 함수. 특정 작업 성공/실패 시 자동 호출될 콜백함수를 추가하는 목적의 함수들이 대부분 고차함수이다. (ex: addOnCompleteListener() 등)

 


[참고자료]

Comments