First, we’ll take away the entire auxiliary code to measure the execution time of the code and output the log. We don’t want this anymore. Now our coroutine will appear to be the instance under. Let me remind you that the receiveData() serve as is suspended and can go back the outcome, which we’ll write to a variable: val information. Then we’ll use this knowledge as a toast message.
The code is slightly easy, which is just right as a result of it’s going to assist you to higher perceive the subject, particularly if you’re taking your first steps on this course.
Now we’ll glance on decompiled Kotlin Bytecode. I in particular got rid of the entire code and left handiest the purposes which might be referred to as in it.
The invoke serve as will probably be referred to as first. It’ll be introduced by way of the CoroutineStart elegance within the release serve as.
The invoke serve as takes the droop serve as and an example of the Continuation elegance as enter parameters. We’ll discuss this elegance in additional element, however for now, here’s what you wish to have to grasp: there are two gadgets that will probably be used when operating code within the coroutine.
We wish to return and take a look at the decompiled Kotlin Bytecode for the invoke serve as. There, we can to find those two gadgets. If we examine, we get:
- Object var1 is block: droop() -> T
- Object var2 is of entirety: Continuation<T>
As we take into account, a complete of 3 purposes have been referred to as within the coroutine, and we checked out one in all them. In flip, the rest two purposes will probably be referred to as within the invoke serve as: create and invokeSuspend.
A better glance presentations that the create serve as paperwork an object of the Continuation elegance.
Additionally, this serve as is contained within the base elegance Continuation. And now not handiest this, however, as we’ll see, the invokeSuspend serve as, which we’ll take a look at just a little later.
And in any case, the 3rd serve as that will probably be referred to as when the Continuation elegance object is created is invokeSuspend. It incorporates the entire code that the coroutine must execute. As we already understood, this serve as will probably be referred to as by way of an object of the Continuation elegance when the coroutine begins.
The principle function of the Continuation elegance is to be sure that the person interface operation (in our case, appearing toast) is carried out handiest after receiving the results of the asynchronous operation of our receiveData serve as. To try this, the code within the invokeSuspend serve as will probably be break up into portions, and a label variable will probably be added to change between items of code.
There are two gadgets inside of: Object var3 and Object var10000. In Object var10000 will probably be put the results of the suspended serve as paintings, and Object var3 incorporates a unique consistent: COROUTINE_SUSPENDED.
The purpose the place the code splits into two portions is the droop serve as. It and the entire code prior to it’s going to pass into the primary section. And the entire code after it’s in the second one. Now, when calling the invokeSuspend serve as, the label variable will resolve which a part of the code will probably be performed. If label is 0, then the primary a part of the code (our receiveData serve as) will probably be performed, and if label is 1, then the second one a part of the code will probably be performed, the place the results of the paintings will probably be written to the variable var10000 after which used for show in toast.
As we found out, the invokeSuspend serve as will probably be referred to as for the primary time firstly of the coroutine and can execute the primary a part of the code in case = 0, which is able to release the droop serve as, and the invokeSuspend serve as will entire (go back).
Earlier than calling the droop serve as, a brand new worth of one will probably be written to the label. That is important in order that when the result’s won, the second one block of code from case 1 will get started operating.
However a logical query arises: how will the serve as be referred to as if it has finished its paintings?
Be aware that the receiveData serve as accepts this as a parameter. This is, the article of the Continuation elegance itself is handed to the droop serve as.
When the droop serve as finishes its paintings, it’s going to take the Continuation object that used to be handed to it and speak to its invokeSuspend serve as. For the reason that worth of label used to be in the past changed by way of 1, when invokeSuspend begins operating once more, the second one a part of the code from case 1 will probably be performed.
In fact, handiest two effects can come from the droop serve as.
- The primary one is the go back of the COROUTINE_SUSPENDED consistent that used to be discussed prior to. It implies that the droop serve as has now not finished its paintings. On this case, the invokeSuspend serve as will probably be finished once more (go back). This will likely proceed till the second one conceivable possibility comes from the droop serve as.
- The second is that if some worth as opposed to the COROUTINE_SUSPENDED consistent is returned. This would be the results of the droop serve as. The code will proceed.
In case 1, the results of the droop serve as will probably be written to the var10000 variable, after which the code will proceed its execution. This variable, as we see within the code under, is used to show the toast, and then the serve as will entire its paintings.