Issue
I am calling suspended function from onCreate(...)
override fun onCreate(savedInstanceState: Bundle?) {
...
...
callGetApi()
}
and the suspended function is:-
suspend fun callGetApi() {....}
But the error shows up Suspend function 'callGetApi' should be called only from a coroutine or another suspend function
Solution
Suspend function should be called only from coroutine. That means you need to use a coroutine builder, e.g. launch. For example:
class Activity : AppCompatActivity(), CoroutineScope {
private var job: Job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
launch {
val result = callGetApi()
onResult(result) // onResult is called on the main thread
}
}
suspend fun callGetApi(): String {...}
fun onResult(result: String) {...}
}
To use Dispatchers.Main in Android add dependency to the app's build.gradle file:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
The BETTER APPROACH would be to use extension properties in ViewModel and Activity/Fragment:
In
ViewModelwe can useviewModelScopeto launch a coroutine:viewModelScope.launch { ... }
It attached to the lifecycle of Activity/Fragment and cancels launched coroutines when they destroyed.
- Similar in
Activity/Fragmentwe can use the following extension properties to launch a coroutine:lifecycleScope.launch {},lifecycle.coroutineScope.launch {},viewLifecycleOwner.lifecycleScope.launch {}(applicable inFragments).
Answered By - Sergey
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.