2017-08-17 3 views
2

Je voudrais demander s'il est possible de 'renvoyer' une valeur à partir d'une fonction si la fonction faisant AsyncTask?Android - Kotlin: valeur de retour en async fun

Par exemple:

fun readData() : Int{ 
    val num = 1; 
    doAsync { 
    for (item in 1..1000000){ 
     num += 1; 
    } 
    } 
    return num; 
} 

Le problème dans cette fonction est que le AsyncTask est fini pas encore si je reçois une mauvaise valeur de la fonction, toute idée comment le résoudre?

utilise une interface est le seul pourquoi ou existe-t-il un gestionnaire de compilation comme dans Swift?

+0

Il n'existe aucun moyen de renvoyer une valeur dans ce sens. Vous pouvez utiliser une fonction de rappel. – fjc

Répondre

3

Si vous effectuez des calculs de manière asynchrone, vous ne pouvez pas renvoyer directement la valeur, car vous ne savez pas si le calcul est terminé. Vous pourriez attendre que cela soit terminé, mais cela rendrait la fonction synchrone à nouveau. Au lieu de cela, vous devez travailler avec callbacks:

fun readData(callback: Int -> Unit) { 
    val num = 1 
    doAsync { 
     for (item in 1..1000000){ 
      num += 1 
     } 
     callback(num) 
    } 
} 

Et callsite:

readData { num -> [do something with num here] } 

Vous pouvez également donner Kotlin coroutines un essai, ce qui rend look code async comme code synchrone régulier, mais ceux-ci peuvent être un peu complexe pour les débutants. (Soit dit en passant, vous n'avez pas besoin dans Kotlin des points-virgules.)

0

Non seulement dans kotlin, c'est pas possible dans toutes les langues de programmation to return from a async method. Mais ce que vous pouvez faire est:

  1. Utilisez co-routines comme Christian suggéré.
  2. Utilisez l'approche réactive comme RxJava or RxKotlin et traitez le flux de données où même si vous ne pouvez pas revenir de votre méthode dans un thread différent, vous pouvez observer le type de retour de la fonction à partir de thread différent. Si vous faites des choses très simples, Callbacks peut être utile.