Task API
Task — это асинхронная задача, возвращающая ошибку или значение в соответствующих callback-уведомлениях (onFailure
, onSuccess
).
В качестве примера реализации используется метод SDK-оплаты getProducts()
.
Обработка результата выполнения Task
Методы, выполняемые асинхронно, возвращают Task<T>
. К примеру, RuStoreBillingClient.getProducts()
возвращает Task<ProductsResponse>
. Это означает, что Task
вернет ProductsResponse
, если выполнение метода было успешно (см. ниже).
val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
Чтобы получить результат успешного выполнения метода, добавьте callback OnSuccessListener
к Task
(см. ниже).
val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnSuccessListener {
// Process success
}
Чтобы получить ошибку выполнения, добавьте callback OnFailureListener
к Task
(см. ниже).
val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnFailureListener {
// Process error
}
Если необходимо получить факт любого завершения Task, используйте метод addOnCompletionListener (см. ниже).
Если [cause] == null, то Task был завершен успешно через [Task.TaskResultProvider.setTaskSuccessResult]. Если [cause] == [TaskCancellationException], то Task завершен через метод [Task.cancel], в противном случае [Task] был завершен c ошибкой через [Task.TaskResultProvider.setTaskErrorResult]
val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnCompletionListener{ cause ->
// Process
}
Многопоточность
Callback, добавлен ные к Task
, выполняются на главном потоке приложения. Если callback необходимо выполнить в другом потоке, передайте свой Executor
в метод добавления callback
.
Добавление executor
через сопроцесс (см. ниже).
val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnSuccessListener(Dispatchers.IO.asExecutor()) {
// Process success
}
Синхронное выполнение
Если ваш код уже выполняется в бэкграунд потоке и вам необходимо получить результат синхронно, вы можете использовать task.await()
(см. ниже).
try {
val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.await()
} catch (e: CancellationException) {
// Process error
}