Understand Kotlin Coroutines on Android (Google I/O'19)

Поділитися
Вставка
  • Опубліковано 15 жов 2024
  • Coroutines are a feature of Kotlin that help convert callback-based code into sequential code, making code easier to read, write, and understand. This session will show you how to use coroutines on Android, and how the new androidx-concurrent library makes it easy to use them to get things off the main thread. You'll also learn how the new library helps coroutines work with Architecture Components. This session also covers coroutine patterns, best practices, and even how to test coroutines!
    Watch more #io19 here:
    Android & Play at Google I/O 2019 Playlist → goo.gle/2GRWlQh
    Google I/O 2019 All Sessions Playlist → goo.gle/io19al...
    Learn more on the I/O Website → google.com/io
    Subscribe to the Android Developers Channel → goo.gle/Androi...
    Get started at → developer.andr...
    Speaker(s): Yigit Boyar, Sean McQuillan, Sergey Vasilinetc
    TF7514 event: Google I/O 2019; re_ty: Publish; product: Android - Languages; fullname: Sean McQuillan, Yigit Boyar;

КОМЕНТАРІ • 118

  • @DeLL116
    @DeLL116 5 років тому +194

    It's crazy how much has changed in Android development in less than 4 years. It's like I learn something, and by the time I've mastered it something new is made to replace what I've just mastered. 🤯

    • @lucasreo3771
      @lucasreo3771 5 років тому +6

      To master background thread, how far is it! I just keep studying,studying,studying.....forever .....

    • @ErictheCoder
      @ErictheCoder 5 років тому +17

      I got called out saying RxJava is outdated 😆

    • @70ME3E
      @70ME3E 5 років тому +12

      yea but it's really getting better. I love the new stuff, much better than the verbose and clunky stuff I had to do before

    • @kirk-patrickbrown866
      @kirk-patrickbrown866 5 років тому

      yep

    • @chitho1987
      @chitho1987 5 років тому +1

      this is true :)

  • @XeaLStorm
    @XeaLStorm 5 років тому +258

    "suspend fun" sounds so sad... :(

  • @famketheron7475
    @famketheron7475 5 років тому +126

    Kotlin documentation for coroutines sucks (to say the least)!

  • @saurabh75prakash
    @saurabh75prakash 4 роки тому +50

    Few years from now they will come up with new way for async programming and say coroutines sucks.

  • @Maarttttt
    @Maarttttt 5 років тому +26

    Sorry but who are these developers you guys are supposedly talking to? How many completely different async solutions are there now for Android? Like 30? Do all these developers constantly want to learn new ways to perform async tasks?

  • @DiegoTube85
    @DiegoTube85 5 років тому +28

    I don't get how Coroutines are presented as an "easy" solution.. They are very hard instead to use properly. I'm trying get it but it's far from easy.. Am I the only one?

    • @_AddSense_
      @_AddSense_ 4 роки тому

      @@TMB_Randy Let me guess, you don't use RxJava either?

    • @tudorpop3579
      @tudorpop3579 4 роки тому +2

      @@_AddSense_ I learned Rx1, then Rx2...not even finished the project I worked on & everybody started pushing coroutines and kt then I switched to backend so I don't have to relearn everything every couple of months. I also pushed hard at first for kotlin then I discovered I hate it because I was never getting NPE in java either but with KT it keeps bothering you with nonsense ! ? ... for now backend is quite nice and stable

    • @chrisfarleycinema
      @chrisfarleycinema Рік тому

      after awhile I start to wonder if this stuff is inaccessible by design

  • @AnkitGusai
    @AnkitGusai 5 років тому +1

    The goal is basically set at 4:26 but at the end of the video it feels like(as always) we are back to square one.
    On the hindsight making anything comprehensive and simple with fragment + activity with their lifecycles is incredibly complex. Throw in a service(Which connects asynchronously and has its own foreground limitations) that needs to be connected and you have to throw everything out of the window.

  • @hitec1691
    @hitec1691 5 років тому +9

    so many methods and so many scopes. It feels like patch work rather than a complete solution to handling thread calls and orientation changes. Specially in case of fragment. I am sure in future a lot more stuff will come to fix what is done right now. IMHO fragments itself should be re-written. For a beginner this is a very steep learning curve.

    • @yashponam1055
      @yashponam1055 4 роки тому +2

      true as a beginner my head is gonna explode now by seeing how fast the android libraries keep changing

  • @krokenstiv8777
    @krokenstiv8777 5 років тому +14

    do you seriously think that coroutines are easier than mvp with rx? I was expecting something really easy but got frustrated.

  • @alxkub
    @alxkub 5 років тому +22

    Ouch, all this is so awfully complicated, I guess I will stick with good old callbacks.

  • @32zim32
    @32zim32 3 роки тому +1

    I don't event know what is better: write some boilerplate code but know what is going on, or learn a lot of new abstractions which you do not fully understand

    • @Jeff-lc2xd
      @Jeff-lc2xd 2 роки тому +1

      ikr, developers has less control over the abstractions, and end up writing more boilerplate to handle them

  • @LiranBarsisa
    @LiranBarsisa 5 років тому +3

    About 30:00 , I don't understand how this works.
    It runs this peace of code on the UI thread, on start, right?
    So how come it waits for "note" variable to be fetched?
    Does it also re-load the data this way, each time it gets changed, or does it load it just once?

  • @megaTiagoNunes1
    @megaTiagoNunes1 5 років тому +6

    Wow! This session was just... perfect! Crazy how much easier and clearer this is compared to the workarounds devs had to do before, really shows how much we can improve tech even now. Really well explained and complete. Would be great if videos like these showing how to use a new feature from the ground up and relating it to other modern libraries were more common. Good work

  • @ellasaro
    @ellasaro 3 роки тому

    Isn't the statement "Kotlin calls loadUser just like a normal function" sort of inaccurate? Wouldn't you need to use either launch or async, for instance? So when the loadUser suspend function is called, the first thing that gets "suspended", in the flow of things, would be that wrapping coroutine, right?

  • @SKtheGEEK
    @SKtheGEEK 5 років тому +6

    so tell me how does this work with MVVM which has a repo, viewmodel and view !!!!

    • @austinvillanueva7491
      @austinvillanueva7491 4 роки тому

      If you are still looking for it. They have these repository. github.com/android/architecture-samples

  • @SecretAgentMan00
    @SecretAgentMan00 2 роки тому +1

    the visuals are wonderful

  • @udhdbdjxisskka
    @udhdbdjxisskka 2 роки тому

    23:46 yeah but cancelation is cooperative, the while loop has to check for isActive property of the coroutine and break from the loop.

  • @DappOllone
    @DappOllone 5 років тому +2

    Looking at the actual code of the LifecycleCoroutineScope, I don't think it works the way they claim. Specifically, I don't see any code that would cause coroutines started with 'launchWhenStarted' to suspend when the state is < STARTED. The only thing LifecycleCoroutineScope seems to actually do is cancel when the lifecycle owner is DESTROYED. I'm wondering how much of this talk is actually useable...

    • @DappOllone
      @DappOllone 5 років тому +1

      So I can say conclusively, from actual testing, that it *does* work. I don't get how it works, but it does.

    • @kyay10
      @kyay10 4 роки тому

      @@DappOllone well, that's probably because onCreate is always (I think) followed by onStart, so, in reality, the only state that would prevent fragment transactions is onDestroy

  • @dharmeshbasapati5039
    @dharmeshbasapati5039 3 роки тому

    Hi Team,
    I hope you are doing great.
    I want to clarify one doubt regarding Kotlin Coroutines.
    How can I delay the execution of the next line or next block of code in my app until the response of my ongoing API comes?
    Thanks in Advance !!!

  • @hantrungkien2701
    @hantrungkien2701 5 років тому +2

    I have used viewModelScope since it released but now after upgrade dependence version of lifecycle to 2.2.0-alpha01, I can't see lifecycleScope or liveData block??? Please help me to try it.

    • @hantrungkien2701
      @hantrungkien2701 5 років тому +3

      I found it in the mvnrepository.
      implementation "androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0-alpha01"
      implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha01"
      implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha01"

  • @ericmartorilopez1911
    @ericmartorilopez1911 5 років тому +2

    At around 28:56 should this do the job also:
    suspend fun loadNote(): Note = viewModelScope.async { repository.loadNote() }
    I don't see the point on this CompletableDeferred. If it should be loaded only once you could use the lazy delegate.
    Why is CompletableDeffered needed?

    • @ErikHuizinga
      @ErikHuizinga 5 років тому +4

      I think the video's code on that slide won't compile (can't check now) and I think the viewModelScope {...} call was meant to be put in an init {...} block. The difference with your code is that your code would only start executing when loadNote() is called. This means that the repository.loadNote() call is started later and therefore could complete later too.
      However, this doesn't answer the difference between CompletableDeferred and just Deferred. A big difference is how they are built: Deferred is built using async {...} and CompletableDeferred through its constructor. The latter allows you to set its value (through the complete(...) function) from another place, which can be convenient if that place does more than just fetching one value asynchronously. Just using async {...} means you start one coroutine to get one value asynchronously as a Deferred. So in other words: it's the same, but CompletableDeferred used like on this slide is more flexible.
      So the same, but different would have been:
      class MyViewModel : ViewModel() {
      val deferredNote = viewModelScope.async { repository.loadNote() }
      fun loadNote() = deferredNote.await()
      }

  • @yasodanagulla8013
    @yasodanagulla8013 4 роки тому

    how to communication corotines to UI in jetpack composables? because we can update UI only in composables

  • @andreykadatsky99
    @andreykadatsky99 5 років тому +6

    Are there any complete samples on github?

  • @ftabashir
    @ftabashir 5 років тому +1

    Thanks guys. Very helpful. Have you shared the lecture notes?

  • @70ME3E
    @70ME3E 5 років тому +1

    10:23 : transforming to another representation from stack to whatever is used for supsendables and then back when resuming, and copying stuff sounds a bit comp intensive, I don't see why we couldn't build separate substacks for the suspendables in the main stack and switching into them and back when necessary. no copying and transforming involved. or am I dumb and threads couldn't manage that and point to other substacks like that temporarily?

    • @beatricekinya5165
      @beatricekinya5165 4 роки тому

      Also wai†ing for reply on this.

    • @johnnybegood8669
      @johnnybegood8669 4 роки тому

      Because that way you wouldn't be able to access local variables from that stack. That's why lambdas in java copy local variables and not referencing them directly. Because of that you can only use final variables in java. In Kotlin, because you just put the coroutine stack back you can treat it as a single stack which not only simplifies things greatly for you but for the cpu too.

  • @psquare4366
    @psquare4366 4 роки тому

    How do you guys test this much complicated scenarios?

  • @EdouardTavinor
    @EdouardTavinor 3 роки тому

    i think the solution with an explicit context as used by go is easier to reason about than this hidden-in-the-background idea of cancellation.

  • @fredrik.larsen
    @fredrik.larsen 5 років тому

    With more focus on Rx in general, Google should show why a reactive paradigm is the way to go. RxJava is a solution for this, coroutines with Flow will also provide a way to achieve it. But this is my issue with comparing RxJava and Coroutines currently. They are not comparable.

    • @ErikHuizinga
      @ErikHuizinga 5 років тому

      I think Google's problem is that Flows neither are stable nor have they been used a lot, so they have to come up with something in the meantime. RxJava is the logical step in between, because it's popular, flexible and powerful. The differences with Kotlin coroutines of today are big, though, so that's precisely why this talk just ignores Rx.

  • @codingCouncil
    @codingCouncil 5 років тому +16

    android development would soon require to be only attempted by stuntmen and Phds. Phds who possibly had two or three Masters in various fields of maths science and computations

    • @AleksandarStefanovic
      @AleksandarStefanovic 5 років тому +3

      Well, I guess you don't have to follow any of the principles or use the tools available. But it in the end, it's about making a high-quality application. These tools seem complex, but they actually reduce the complexity of an app, so one has to choose either implementing a "complex" architecture from the start, or maintain an app that because complex after growth.

  • @maxchin2
    @maxchin2 5 років тому +14

    Things are like getting out of hand soon. It is more and more costly to understand and master Android app development. Even the Android software engineer at Google has hard time to explain the things in easy to understand way.

    • @silver10188
      @silver10188 5 років тому +1

      Ikr? I wonder what happened to intent service. Also Kotlin plays a huge part in that mountain of new things since the code doesn't look like java.

    • @RS-kt6is
      @RS-kt6is 5 років тому +4

      I had tried these "new" coroutines a while ago... hard to grasp... The first iteration of this was much simpler.... I understand what they want to do, but honestly.....
      I think they should all be taken away from the development of any new feature for a couple of years, there really is no point now. And just let them fix their own mess and try to explain all of it as well.
      I don't see any of these people writing books, writing interesting blogs.....
      It just seems that software development is getting more and more 'magical' in order to fulfil some unknown need somewhere..... and moving towards tougher and tougher to grasp and to implement and to debug paradigms.... with little to no added value for the end result, which should be a humble app

    • @patomaletero
      @patomaletero 5 років тому +1

      to retrieve data from network and update the UI it's a such common problem that I would expect to have a easy way to solve it, considering common use cases like rotation or user switching apps, but apparently it always will be a complicated problem

  • @matthieulucas9059
    @matthieulucas9059 5 років тому

    Best explanation of coroutines i've seen!

  • @sinarahimi3041
    @sinarahimi3041 4 роки тому +1

    It would be great if they put the slides in somewhere

  • @mahmoudhadizadeh9989
    @mahmoudhadizadeh9989 2 роки тому +1

    It was super helpful 🙏

    • @AndroidDevelopers
      @AndroidDevelopers  2 роки тому +2

      We're delighted to hear this, Mahmoud. Have you checked out our Kotlin Coroutines guide? See it here 📖 : goo.gle/3SGg08P

  • @tekinsal8396
    @tekinsal8396 5 років тому +30

    Android development has become a mess...

  • @krokenstiv8777
    @krokenstiv8777 5 років тому +2

    Rx Java is very good to use with MVP

  • @davidespano8674
    @davidespano8674 2 роки тому

    I agree, iti s interesting and useful. Thank you.

  • @mikeshilovski1512
    @mikeshilovski1512 3 роки тому +1

    ah.. why threading is so complicated

  • @ElliotMitchellR
    @ElliotMitchellR 5 років тому +2

    One of the best sessions by date

  • @rodrigmatrix
    @rodrigmatrix 5 років тому

    Thanks for all those keynotes google

  • @SasiKumarsachin12
    @SasiKumarsachin12 4 роки тому

    Its interesting and usefully..Thanks

  • @ViktorYakunin
    @ViktorYakunin 5 років тому +4

    1. CoroutineWorker - ok, I had to make Woker implement CoroutineScope before. +1
    2. Retrofit - there is Adapter by Jack 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' +0
    3. Room - ok, previously there was suspended fun in the Repo for this purpose. +0
    4. LiveData with Coroutines - LiveData should be simple as F. -1
    5. viewModelScope - Previously had to implement CoroutineScope. +1
    6. lifecycleScope, when started - Good for Animations, Transitions, etc... +1
    7. coroutines-test - Best part, trick with immediate delay is awesome! +3
    8. Part where dude tried to get data in onCreate() - Uncle Bob would destroy you! -5
    total: 0. You did a lot of work but I had 3 projects in prod with coroutines (+dozen tests) and nothing fundamentally changed, now I need to checkout that pack of libs to find that they are so alpha :)

    • @ReinaldoMoreiradaSilva
      @ReinaldoMoreiradaSilva 5 років тому

      I didn't watch the whole video but, I was curious about point 8, he tries to load data in onCreate without showing any kind of architecture? is that it?

  • @dialloyero5000
    @dialloyero5000 2 роки тому

    Android devel fantastic

  • @JesusAnguloGasco
    @JesusAnguloGasco 4 роки тому +7

    Kotlin discover async/await from C# #justKidding xD

    • @bty_s
      @bty_s 4 роки тому +5

      coroutines appeared in 60s, it is not that new
      and async/await is based on languages that exists before C#

  • @MrYura999
    @MrYura999 3 роки тому

    I hear consolation instead of cancellation

  • @TomaszRykala
    @TomaszRykala 5 років тому +1

    Computatations @ 3:39

  • @codeinvestocoders
    @codeinvestocoders 8 місяців тому

    Nice

  • @arna591
    @arna591 5 років тому +11

    Sorry but worst talk ever. I could not be anymore confused.

  • @nikiizvorski1585
    @nikiizvorski1585 5 років тому +2

    Google Writes the best code. You are so funny :)))))))))

  • @KeySabre
    @KeySabre 5 років тому

    Can’t wait to use these coroutine components.

  • @nguyenxuanlanh6824
    @nguyenxuanlanh6824 4 роки тому

    thanks

  • @manthrasolutions1353
    @manthrasolutions1353 5 років тому

    Yes

  • @KhaledKimboo4
    @KhaledKimboo4 5 років тому +1

    Just "exactly" like async/await from c# but let's just rename it.

    • @KhaledKimboo4
      @KhaledKimboo4 5 років тому

      And coroutinewroker = Task

    • @daschewie
      @daschewie 5 років тому +2

      Exactly like synchronous monads in haskell, lets just claim C# invented it.

    • @kyay10
      @kyay10 4 роки тому

      Not exactly tho, there are really huge differences between them.

  • @MrSTJEREM
    @MrSTJEREM 5 років тому +2

    Terrible audio quality 19:00

  • @asad325able
    @asad325able 5 років тому

    1st to comment.
    Coroutines atlast

  • @JeffreyLiu8
    @JeffreyLiu8 5 років тому

    why 1_000 instead of 1000?

    • @LiranBarsisa
      @LiranBarsisa 5 років тому

      It's the same...

    • @mithatsinansar3366
      @mithatsinansar3366 5 років тому +3

      In Kotlin, you can seperate number by "_" to make it easier to read.

    • @agapch
      @agapch 5 років тому +2

      @@mithatsinansar3366 you can do the same in Java, starting from 1.7.

    • @kyay10
      @kyay10 4 роки тому

      Cuz Kotlin

  • @АлександрИнженер-д4б

    Sergey Strelcov lol

  • @SnoopyDoofie
    @SnoopyDoofie 5 років тому +3

    Boring. Put me to sleep.

  • @ericmartorilopez1911
    @ericmartorilopez1911 5 років тому

    At around 28:56 should this do the job also:
    suspend fun loadNote(): Note = viewModelScope.async { repository.loadNote() }
    I don't see the point on this CompletableDeferred. If it should be loaded only once you could use the lazy delegate.
    Why is CompletableDeffered needed?

    • @metusrex
      @metusrex 5 років тому

      it's about caching the returned value. notice that actual start of coroutine happens when viewmodel is created. in your example each call to the function will start new coroutine in scope of view model (instead of caller scope) which I'd guess kind of violates structured concurrency principle (if I understand it correctly ;))