[Android] Google Play services - Task<TResult> 타입
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() 등)
[참고자료]
- Google Play services Reference, https://developers.google.com/android/reference/packages
- Task, https://developers.google.com/android/reference/com/google/android/gms/tasks/Task
- The Tasks API, https://developers.google.com/android/guides/tasks