web-dev-qa-db-fra.com

Comment appeler la fonction de suspension de fragment ou d'activité?

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{...}
6

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)
    }
 }
}
0

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()
         }

    }
2
Boonya Kitpitak

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
}
0
vikas kumar

essayez comme ça:

suspend fun foundError() {
coroutineScope {
    async { 
        throw StructuredConcurrencyWill("throw")
    }
 }
}
0
bugfreerammohan