SlideShare a Scribd company logo
1 of 100
Download to read offline
Kotlin Coroutines:
Let it async in
Bapusaheb Patil
Google Certified Android Developer,
IDF Certified UX Designer
www.bapspatil.com
bapspatil.com
Where I work...
bapspatil.com
boolean isCodelab = false;
bapspatil.com
boolean isCodelab = false;
val isCodelab = false
bapspatil.com
Who this talk is for…
● Kotlin basics
● Asynchronous programming basics
● Anyone who can handle lame jokes
& memes
bapspatil.com
bapspatil.com
What are Coroutines?
● Light-weight threads
● Asynchronous
● Non-blocking code
bapspatil.com
Why Coroutines?
bapspatil.com
Let’s talk about refresh rates...
bapspatil.com
Most phones 60Hz 16ms
ASUS ROG 90Hz 12ms
Razer, Razer 2 120Hz 8ms
bapspatil.com
● XML parsing
● View inflation
● View measurement
● View positioning
Your app on the Main Thread
bapspatil.com
bapspatil.com
How do we do that?
bapspatil.com
AsyncTask
class MyTask: AsyncTask<URL, Void, String>() {
override fun doInBackground(vararg params: URL?):
String? {
......
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
......
}
}
bapspatil.com
Loader
class MyLoader(context: Context, private val url:
URL) : AsyncTaskLoader<String>(context) {
override fun onStartLoading() {
forceLoad()
}
override fun loadInBackground(): String? {
.........
}
}
bapspatil.com
Thread
Thread(Runnable() {
override fun run() {
......
}
}).start()
bapspatil.com
CompletableFuture
var completableFuture
= CompletableFuture.supplyAsync(object:Supplier<String>() {
fun get():String {
try {
doLongTask()
} catch (e:InterruptedException) {
throw IllegalStateException(e)
}
return "Result of the asynchronous computation"
}
})
val result = completableFuture.get()
minSdk >= 24
bapspatil.com
IntentService
class MyService : IntentService() {
override fun onHandleIntent(Intent intent) {
......
}
}
<service
android:name=”.MyService”
android:exported=false />
bapspatil.com
● JobScheduler
● Firebase JobDispatcher
● android-job by Evernote
bapspatil.com
RxJava2
myDisposable.add(myApiService
.getMyObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result ->
updateUIWithResult(result)
},{ throwable ->
showError()
}))
bapspatil.com
Enter, Coroutines.
bapspatil.com
Why Coroutines?
● Light-weight
● No context-switching
● Faster than a Thread
● Use your cores
bapspatil.com
How do we use
Coroutines?
bapspatil.com
Experimental
Coroutines
Stable
Coroutines
bapspatil.com
If you’ve been using
Coroutines so far...
bapspatil.com
Experimental Coroutines
bapspatil.com
bapspatil.com
How to use stable
Coroutines...
bapspatil.com
bapspatil.com
bapspatil.com
bapspatil.com
bapspatil.com
Launching
your first
Coroutine...
bapspatil.com
Blocking Functions
vs.
Suspending Functions
bapspatil.com
Blocking Function
bapspatil.com
fun A()
fun B()
Suspending Function
bapspatil.com
fun A()
fun B()
suspended
Suspending Function
bapspatil.com
suspend fun doLongTask(): Unit? {
......
}
fun doLongTask(): Unit? {
......
}
Suspending function
bapspatil.com
Coroutine Builders
● launch Returns Job
● async Returns Deferred
bapspatil.com
launch {
doLongTask()
} Job
// Fire and forget!
bapspatil.com
val job = launch {
doLongTask()
}
job.join() If you need to suspend the coroutine
job.cancel()
Job
bapspatil.com
bapspatil.com
async {
doLongTask()
}
suspend fun doLongTask(): String? {
......
return resultString
}
// Return something in the future
Deferred<String>
bapspatil.com
val deferred = async {
doLongTask()
}
val result = deferred.await()
deferred.cancel()
Deferred<String>
bapspatil.com
launch {
val result = async {
doLongTask()
}.await()
}
bapspatil.com
launch {
val result = withContext(IO) {
doLongTask()
}
}
bapspatil.com
Let’s convert sync to async...
bapspatil.com
suspend fun fetchMovieData() {
val popularMovies = apiService.getMoviesByType(“POPULAR”)
val topRatedMovies = apiService.getMoviesByType(“TOP_RATED”)
val upcomingMovies = apiService.getMoviesByType(“UPCOMING”)
val nowPlayingMovies = apiService.getMoviesByType(“NOW_PLAYING”)
val allMovies = mergeAllMovies(popularMovies, topRatedMovies,
upcomingMovies, nowPlayingMovies)
database.saveToDb(allMovies)
}
Takes 4.8 seconds
bapspatil.com
suspend fun fetchMovieData() {
val popularDeferred = async { apiService.getMoviesByType(“POPULAR”) }
val topRatedDeferred = async { apiService.getMoviesByType(“TOP_RATED”) }
val upcomingDeferred = async { apiService.getMoviesByType(“UPCOMING”) }
val nowPlayingDeferred = async { apiService.getMoviesByType(“NOW_PLAYING”) }
val popularMovies = popularDeferred.await()
val topRatedMovies = topRatedDeferred.await()
val upcomingMovies = upcomingDeferred.await()
val nowPlayingMovies = nowPlayingDeferred.await()
val allMovies = mergeAllMovies(popularMovies, topRatedMovies, upcomingMovies,
nowPlayingMovies)
database.saveToDb(allMovies)
}
bapspatil.com
suspend fun fetchMovieData() {
val popularDeferred = async { apiService.getMoviesByType(“POPULAR”) }
val topRatedDeferred = async { apiService.getMoviesByType(“TOP_RATED”) }
val upcomingDeferred = async { apiService.getMoviesByType(“UPCOMING”) }
val nowPlayingDeferred = async { apiService.getMoviesByType(“NOW_PLAYING”) }
val allMovies = mergeAllMovies(popularDeferred.await(), topRatedDeferred.await(),
upcomingDeferred.await(), nowPlayingDeferred.await())
database.saveToDb(allMovies)
}
Takes 2.6 seconds
bapspatil.com
suspend fun fetchMovieData() {
val popularDeferred = async { apiService.getMoviesByType(“POPULAR”) }
val topRatedDeferred = async { apiService.getMoviesByType(“TOP_RATED”) }
val upcomingDeferred = async { apiService.getMoviesByType(“UPCOMING”) }
val nowPlayingDeferred = async { apiService.getMoviesByType(“NOW_PLAYING”) }
val allMovies = mergeAllMovies(popularDeferred.await(), topRatedDeferred.await(),
upcomingDeferred.await(), nowPlayingDeferred.await())
database.saveToDb(allMovies)
// Update the UI from the suspending function
runOnUiThread { updateUI(allMovies) }
}
Updating the UI...
bapspatil.com
Launching a Coroutine from
another Coroutine...
bapspatil.com
launch {
doSomeWork()
launch {
val result = async {
getSomeResult()
}
doMoreWork(result.await())
}
launch {
doEvenMoreWork()
}
}
bapspatil.com
Coroutines in an
Activity...
bapspatil.com
class MyActivity : AppCompatActivity() {
private val compositeDisposable = CompositeDisposable()
override fun onCreate() {
// ...
compositeDisposable.add(getFirstObservable())
compositeDisposable.add(getSecondObservable())
}
override fun onDestroy() {
super.onDestroy()
compositeDisposable.clear()
}
}
bapspatil.com
class MyActivity : AppCompatActivity() {
private var firstJob: Job? = null
private var secondJob: Job? = null
override fun onCreate() {
// ...
firstJob = launch {
doSomeWork()
}
secondJob = launch {
doSomeMoreWork()
}
}
override fun onDestroy() {
super.onDestroy()
firstJob.cancel()
secondJob.cancel()
}
} bapspatil.com
bapspatil.com
RxJava2 → CompositeDisposable
Coroutines → Job
bapspatil.com
class MyActivity : AppCompatActivity() {
lateinit var activityJob: Job
override fun onCreate() {
activityJob = Job()
val outerJob = launch(parent = activityJob) {
val firstJob = launch {
doSomeWork()
}
val secondJob = launch {
doSomeMoreWork()
}
}
}
override fun onDestroy() {
super.onDestroy()
activityJob.cancel()
}
}
bapspatil.com
val outerJob = launch(parent = activityJob) {
val firstJob = launch {
doSomeWork()
}
val secondJob = launch {
doSomeMoreWork()
}
}
● outerJob gets canceled.
● firstJob & secondJob do not!
bapspatil.com
val outerJob = launch(parent = activityJob) {
val firstJob = launch {
doSomeWork()
}
val secondJob = launch {
doSomeMoreWork()
}
}
bapspatil.com
val outerJob = launch(parent = activityJob) {
val firstJob = launch(parent = activityJob) {
doSomeWork()
}
val secondJob = launch(parent = activityJob) {
doSomeMoreWork()
}
}
bapspatil.com
launch(parent = activityJob)
Restricts the scope of the coroutine to
Activity’s lifecycle, but not its child
coroutines.
bapspatil.com
Deprecated
launch(parent = activityJob)
Restricts the scope of the coroutine to
Activity’s lifecycle, but not its child
coroutines.
Coroutines 0.26+ → Forget it.
bapspatil.com
Job
CoroutineScope
bapspatil.com
CoroutineScope &
CoroutineContext
bapspatil.com
● Activities
● Fragments
● ViewModels
bapspatil.com
class MyActivity : AppCompatActivity(), CoroutineScope {
lateinit var activityJob: Job
override val coroutineContext: CoroutineContext
get() = activityJob + Dispatchers.Main
override fun onCreate() {
// ...
activityJob = Job()
val outerJob = this.launch(context = coroutineContext) {
val firstJob = launch {
doSomeWork()
}
val secondJob = launch {
doSomeMoreWork()
}
}
}
override fun onDestroy() {
super.onDestroy()
activityJob.cancel()
}
}
bapspatil.com
launch(context = coroutineContext)
● Restricts the scope of the coroutine to
Activity’s lifecycle.
● Cancels all nested coroutines if parent
coroutine is canceled.
bapspatil.com
fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job (source)
bapspatil.com
CoroutineStart
bapspatil.com
● DEFAULT
● LAZY
● ATOMIC
● UNDISPATCHED
What’s a
Coroutine
Dispatcher?
bapspatil.com
CoroutineDispatcher
2+
64+
Android Main Thread
bapspatil.com
● Dispatchers.Default
● Dispatchers.IO
● Dispatchers.Main
● Dispatchers.Unconfined
val result = withContext(IO) {
doLongTask()
}
bapspatil.com
override val coroutineContext: CoroutineContext
get() = activityJob + Dispatchers.Main
bapspatil.com
bapspatil.com
Coroutines over
RxJava2...
bapspatil.com
suspend fun getFullMovieData(id: Int): Single<FullMovieData> {
val movieData = moviesRepo.getMovieData(id).subscribeOn(Schedulers.io)
val castData = moviesRepo.getCastData(id).subscribeOn(Schedulers.io)
return Single.zip(movieData, castData, BiFunction { movieData, castData ->
FullMovieData(movieData, castData)
})
}
bapspatil.com
suspend fun getFullMovieData(id: Int): FullMovieData {
id.let {
val movieData = async { moviesRepo.getMovieData(it) }
val castData = async { moviesRepo.getCastData(it) }
return FullMovieData(movieData.await(), castData.await())
}
return FullMovieData()
}
bapspatil.com
suspend fun getMovieTitle(query: String?): Single<String> {
return moviesRepo.searchForMovies(query).map { movieResults ->
if(movieResults.isNotEmpty() && movieResults[0].title != null) {
movieResults[0].title
} else {
errorString
}
}
}
bapspatil.com
suspend fun getMovieTitle(query: String?): String? {
query?.let {
val movieResults = withContext(IO) { moviesRepo.searchForMovies(it) }
val movieTitle = movieResults?.getOrNull(0)?.title
return movieTitle ?: errorString
}
return “”
}
bapspatil.com
bapspatil.com
Easy
threading
bapspatil.com
subscribeOn
observeOn
bapspatil.com
subscribeOn
observeOn
CoroutineDispatchers
Coroutine Builders
bapspatil.com
kotlinx-coroutines-rx2
bapspatil.com
rxSingle Single
rxCompletable Completable
rxMaybe Maybe
rxObservable Observable
rxFlowable Flowable
bapspatil.com
Retrofit
bapspatil.com
fun getPopularMovies(): Single<List<Movie>>
bapspatil.com
fun getPopularMovies(): Single<List<Movie>>
suspend fun getPopularMovies(): List<Movie>
Coming soon!
bapspatil.com
Coroutines
+
Retrofit
bapspatil.com
Where do I
learn
Coroutines?
bapspatil.com
codelabs.developers.google.com/codelabs/kotlin-coroutines
bapspatil.com
kotlinexpertise.com
bapspatil.com
kotlinlang.org/docs/reference/coroutines-overview.html
bapspatil.com
kotlin.github.io/kotlinx.coroutines
bapspatil.com
android.jlelse.eu proandroiddev.com
bapspatil.com
bapspatil.com
Thank you.
linkedin.com/in/bapspatil
medium.com/@bapspatil
instagram.com/bapspatil
twitter.com/baps_patil
(couldn’t get @bapspatil for this one! ☹)
Bapusaheb Patil
Google Certified
Android Developer • IDF
Certified UX Designer
www.bapspatil.com

More Related Content

What's hot

Build Lightweight Web Module
Build Lightweight Web ModuleBuild Lightweight Web Module
Build Lightweight Web Module
Morgan Cheng
 
CompletableFuture
CompletableFutureCompletableFuture
CompletableFuture
koji lin
 
Boom! Promises/A+ Was Born
Boom! Promises/A+ Was BornBoom! Promises/A+ Was Born
Boom! Promises/A+ Was Born
Domenic Denicola
 

What's hot (20)

Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017
 
JavaScript Promise
JavaScript PromiseJavaScript Promise
JavaScript Promise
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScript
 
Containers & Dependency in Ember.js
Containers & Dependency in Ember.jsContainers & Dependency in Ember.js
Containers & Dependency in Ember.js
 
Build Lightweight Web Module
Build Lightweight Web ModuleBuild Lightweight Web Module
Build Lightweight Web Module
 
Javascript Promises/Q Library
Javascript Promises/Q LibraryJavascript Promises/Q Library
Javascript Promises/Q Library
 
The evolution of java script asynchronous calls
The evolution of java script asynchronous callsThe evolution of java script asynchronous calls
The evolution of java script asynchronous calls
 
The evolution of asynchronous javascript
The evolution of asynchronous javascriptThe evolution of asynchronous javascript
The evolution of asynchronous javascript
 
$q and Promises in AngularJS
$q and Promises in AngularJS $q and Promises in AngularJS
$q and Promises in AngularJS
 
High Performance web apps in Om, React and ClojureScript
High Performance web apps in Om, React and ClojureScriptHigh Performance web apps in Om, React and ClojureScript
High Performance web apps in Om, React and ClojureScript
 
CompletableFuture
CompletableFutureCompletableFuture
CompletableFuture
 
Good karma: UX Patterns and Unit Testing in Angular with Karma
Good karma: UX Patterns and Unit Testing in Angular with KarmaGood karma: UX Patterns and Unit Testing in Angular with Karma
Good karma: UX Patterns and Unit Testing in Angular with Karma
 
JS Fest 2018. Сергей Пузанков. E2E-тестирование фронтенда c Hermione
JS Fest 2018. Сергей Пузанков. E2E-тестирование фронтенда c HermioneJS Fest 2018. Сергей Пузанков. E2E-тестирование фронтенда c Hermione
JS Fest 2018. Сергей Пузанков. E2E-тестирование фронтенда c Hermione
 
Promises, Promises
Promises, PromisesPromises, Promises
Promises, Promises
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.js
 
Kotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is comingKotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is coming
 
Boom! Promises/A+ Was Born
Boom! Promises/A+ Was BornBoom! Promises/A+ Was Born
Boom! Promises/A+ Was Born
 
Connecting your phone and home with firebase and android things - James Cogga...
Connecting your phone and home with firebase and android things - James Cogga...Connecting your phone and home with firebase and android things - James Cogga...
Connecting your phone and home with firebase and android things - James Cogga...
 
JavaScript Promises
JavaScript PromisesJavaScript Promises
JavaScript Promises
 
Avoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAvoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promises
 

Similar to Kotlin Coroutines: Let it async in

Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdfCompose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
ssuserb6c2641
 

Similar to Kotlin Coroutines: Let it async in (20)

Kotlin Coroutines and Rx
Kotlin Coroutines and RxKotlin Coroutines and Rx
Kotlin Coroutines and Rx
 
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdfCompose로 Android:Desktop 멀티플랫폼 만들기.pdf
Compose로 Android:Desktop 멀티플랫폼 만들기.pdf
 
The Code
The CodeThe Code
The Code
 
Coroutines talk ppt
Coroutines talk pptCoroutines talk ppt
Coroutines talk ppt
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBox
 
The hitchhicker’s guide to unit testing
The hitchhicker’s guide to unit testingThe hitchhicker’s guide to unit testing
The hitchhicker’s guide to unit testing
 
RubyMotion
RubyMotionRubyMotion
RubyMotion
 
droidcon Transylvania - Kotlin Coroutines
droidcon Transylvania - Kotlin Coroutinesdroidcon Transylvania - Kotlin Coroutines
droidcon Transylvania - Kotlin Coroutines
 
Exploring Kotlin
Exploring KotlinExploring Kotlin
Exploring Kotlin
 
JavaScript Functions
JavaScript FunctionsJavaScript Functions
JavaScript Functions
 
JavaScript Async for Effortless UX
JavaScript Async for Effortless UXJavaScript Async for Effortless UX
JavaScript Async for Effortless UX
 
Scti 2011 minicurso jquery
Scti 2011 minicurso jqueryScti 2011 minicurso jquery
Scti 2011 minicurso jquery
 
Доклад Антона Поварова "Go in Badoo" с Golang Meetup
Доклад Антона Поварова "Go in Badoo" с Golang MeetupДоклад Антона Поварова "Go in Badoo" с Golang Meetup
Доклад Антона Поварова "Go in Badoo" с Golang Meetup
 
Coroutines in Kotlin. In-depth review
Coroutines in Kotlin. In-depth reviewCoroutines in Kotlin. In-depth review
Coroutines in Kotlin. In-depth review
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.
 
Vermont Code Camp 2014 Simple Rover with RaspberryPi
Vermont Code Camp 2014   Simple Rover with RaspberryPiVermont Code Camp 2014   Simple Rover with RaspberryPi
Vermont Code Camp 2014 Simple Rover with RaspberryPi
 
From Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiperFrom Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiper
 
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin is charming; The reasons Java engineers should start Kotlin.
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 

Recently uploaded

VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
dharasingh5698
 
result management system report for college project
result management system report for college projectresult management system report for college project
result management system report for college project
Tonystark477637
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Dr.Costas Sachpazis
 
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Christo Ananth
 

Recently uploaded (20)

Introduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxIntroduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptx
 
University management System project report..pdf
University management System project report..pdfUniversity management System project report..pdf
University management System project report..pdf
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptx
 
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
The Most Attractive Pune Call Girls Manchar 8250192130 Will You Miss This Cha...
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptxBSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
BSides Seattle 2024 - Stopping Ethan Hunt From Taking Your Data.pptx
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
 
result management system report for college project
result management system report for college projectresult management system report for college project
result management system report for college project
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performance
 
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTINGMANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
MANUFACTURING PROCESS-II UNIT-1 THEORY OF METAL CUTTING
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghly
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
 
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...Booking open Available Pune Call Girls Koregaon Park  6297143586 Call Hot Ind...
Booking open Available Pune Call Girls Koregaon Park 6297143586 Call Hot Ind...
 
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
 
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete RecordCCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
CCS335 _ Neural Networks and Deep Learning Laboratory_Lab Complete Record
 

Kotlin Coroutines: Let it async in