Skip to content

Instantly share code, notes, and snippets.

@ErikHellman
Last active March 20, 2020 20:42
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ErikHellman/057ce5de3d438233532d6787cb00b0ea to your computer and use it in GitHub Desktop.
Save ErikHellman/057ce5de3d438233532d6787cb00b0ea to your computer and use it in GitHub Desktop.
Kotlin Coroutine Android Loader
internal class CoroutineLifecycleListener(private val deferred: Deferred<*>) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun cancelCoroutine() {
deferred.cancel()
}
}
internal var POOL = newFixedThreadPoolContext(2, "loader")
fun <T> LifecycleOwner.load(loader: () -> T): Deferred<T> {
val deferred = async(context = POOL, start = CoroutineStart.LAZY) { loader() }
val coroutineLifecycleListener = CoroutineLifecycleListener(deferred)
lifecycle.addObserver(coroutineLifecycleListener)
return deferred
}
infix fun <T> Deferred<T>.then(block: (T) -> Unit) = async(context = UI) { block(this@then.await()) }
class MyActivity : AppCompatActivity() {
lateinit var text: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
load {
"This is an expensive loading..."
} then {
text = it
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment