Je veux demander la permission et le faire par fonction anti-bloquette. Depuis que j'ai besoin de contexte, je ne peux pas l'appeler de viewmodel. Comment donner une portée d'interface utilisateur par défaut pour fragment et appelez la fonction de suspension comme suit:
class MapsFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
launch {
withContext(Dispatcher.Main){
checkLocationPermission().await()
}
}
}
}
suspend fun checkLocationPermission():Boolean{...}
Dans la documentation https://developer.android.com/topic/libraires/architecture/coroutines a déclaré que je peux utiliser androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha01
ktx.
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
Vous pouvez soit utiliser
GlobalScope.lanch {
}
ou alors
Faites votre cheminement/votre activité CoroutineScope
et définissez le répartiteur par défaut comme celui-ci.
class Fragment : CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
. . .
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
}
Ensuite, vous pouvez appeler la fonction de suspension comme le code que vous avez connecté dans la question.
Mise à jour
La portée de la Coroutin d'activité/fragment peut être définie comme celle-ci.
class Fragment : CoroutineScope by MainScope() {
...
override fun onDestroy() {
super.onDestroy()
cancel()
}
}
Nous pouvons retourner un MutableLiveData
de la fonction et attendre que la coroutine fonctionne et revienne en arrière.
fun fetchDocuments(): MutableLiveData<TodoResponseModel> {
val mutableLiveData = MutableLiveData<TodoResponseModel>()
Log.d("COROUTINE", "Main Context started")
GlobalScope.async(Dispatchers.Main) {
Log.d("COROUTINE", "IO Context started")
val response = repository.getTodoCoroutineFourth()
Log.d("COROUTINE", "IO Context completed")
mutableLiveData.value = response.body()
Log.d("COROUTINE", "IO Context finished")
}
Log.d("COROUTINE", "Main Context ended")
return mutableLiveData
}
essayez comme ça:
suspend fun foundError() {
coroutineScope {
async {
throw StructuredConcurrencyWill("throw")
}
}
}