Anko Coroutines

Dmitry Jemerov edited this page May 12, 2017 · 6 revisions

Contents

Using Anko Coroutines in your project

Add the anko-coroutines dependency to your build.gradle:

dependencies {
    compile "org.jetbrains.anko:anko-coroutines:$anko_version"
}

Listener helpers

asReference()

If your asynchronous API does not support cancellation, your coroutine may be suspended for an indefinite time period. As a coroutine holds the strong references to captured objects, capturing the instance of Activity or Fragment instance may cause a memory leak.

Use asReference() in such cases instead of the direct capturing:

suspend fun getData(): Data { ... }

class MyActivity : Activity() {
    fun loadAndShowData() {
	// Ref<T> uses the WeakReference under the hood
	val ref: Ref<MyActivity> = this.asReference()

	async(UI) {
	    val data = getData()
			
	    // Use ref() instead of this@MyActivity
	    ref().showData()
	}
    }

    fun showData(data: Data) { ... }
}

bg()

You can easily execute your code on the background thread using bg():

fun getData(): Data { ... }
fun showData(data: Data) { ... }

async(UI) {
    val data: Deferred<Data> = bg {
	// Runs in background
	getData()
    }

    // This code is executed on the UI thread
    showData(data.await())
}