Skip to main content

Task API

Task — asynchronous task that returns an error or value in the corresponding callback (onFailure, onSuccess).

Below is an implementation example which applies the SDK payment method getProducts().

Task processing example

Async methods return Task<T>. For example, RuStoreBillingClient.getProducts() returns Task<ProductsResponse>. Thus, Task will return ProductsResponse if the method appears to be successful. .

val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()

Add callback OnSuccessListener to Task in order to get the successful method result: .

val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnSuccessListener {
// Process success
}

To get an execution error, add callback OnFailureListener to Task .

val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnFailureListener {
// Process error
}

Add addOnCompletionListener to Task if you need to get both a successful result and error: .

If [cause] == null, then the Task was completed successfully via [Task.TaskResultProvider.setTaskSuccessResult]. If [cause] == [TaskCancellationException], the Task is terminated via [Task.cancel] method, otherwise [Task] was terminated with an error via [Task.TaskResultProvider.setTaskErrorResult]

val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnCompletionListener{ cause ->
// Process
}

Multi-threading

Callback added to Task are performed on the main app thread. To run callback in other threads, transfer your Executor to the callback method.

Adding executor via corpusins .

val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.addOnSuccessListener(Dispatchers.IO.asExecutor()) {
// Process success
}

Synchronous execution

You can use task.await() if your code is already executed in the working thread and you need to get the result synchronously .

try {
val task: Task<ProductsResponse> = RuStoreBillingClient.products.getProducts()
task.await()
} catch (e: CancellationException) {
// Process error
}
caution

The await() method blocks the thread in which it runs. To avoid ANR, call the await() method in the background thread.

caution

Use await() method after teh following SDKs only: Biling SDK - billingclient:1.1.1 Push Notifications SDK - pushclient:0.1.8 Feedback&Ratings SDK - review:0.1.6 App Update SDK- appupdate:0.1.1

Calling the await() method for SDKs of earlier versions may result in increased battery consumption!

Handling Task API via coprocesses

You can use the following code to process the Task in a coprocess.

suspend fun <T> Task<T>.wrapInCoroutine(): Result<T> =
suspendCancellableCoroutine { cont ->

cont.invokeOnCancellation { cancel() }

addOnSuccessListener { value ->
if (cont.isActive) {
cont.resume(Result.success(value))
}
}
addOnFailureListener { error ->
if (cont.isActive) {
cont.resume(Result.failure(error))
}
}
}