3
votes

L'application Android se bloque sans aucune erreur de suivi de pile

Je viens de commencer avec cette nouvelle application et je voulais voir si j'obtiens une réponse par Retrofit et l'imprimer dans un TextView.

Mais l'application plante sans aucune trace de pile, donc pas d'exception ... juste rien. p>

J'ai une interface Retrofit et une "Factory" qui crée la requête tout s'exécute dans un thread différent via Kotlin Coroutine.

    class MainActivity : AppCompatActivity() {

    private lateinit var debugTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        debugTextView = findViewById(R.id.debugTextView)

        val service = RetrofitFactory.makeCarDataService()
        GlobalScope.launch(Dispatchers.Main) {
            val request = service.getData()

            val response = request.await()

            debugTextView.text =response.toString()

        }
    }
}

J'aimerais publier un Erreur ... mais il n'y en a pas, tout devrait fonctionner parfaitement: /


3 commentaires

impossible il n'y a pas de stacktace ...


Juste une trace de pile du démarrage de l'application et du débogueur, mais l'application se bloque immédiatement sans erreur / exception ...


Supprimez tout le code après debugTextView = findViewById (R.id.debugTextView) , s'est-il écrasé?


4 Réponses :


0
votes

Sans stacktrace, voici les problèmes possibles:

response.toString()

peut lancer NullPointerException

debugTextView.text

peut lancer NullPointerException

service.getData()

peut lancer NullPointerException


0 commentaires

0
votes

Je ne suis pas très familier avec les coroutines, mais avez-vous essayé d'utiliser le thread principal uniquement lors de la définition du texte sur la vue? quelque chose comme ceci:

val service = RetrofitFactory.makeCarDataService()
    GlobalScope.launch(Dispatchers.Default/*change here*/) {
        val request = service.getData()

        val response = request.await()
        /*change here*/
        withContext(Dispatchers.Main) {
            debugTextView.text = response.toString()
        }

    }
}


0 commentaires

4
votes

Pour utiliser Dispatchers.Main , nous devons ajouter la ligne suivante aux dépendances du fichier build.gradle de l'application:

implémentation 'org.jetbrains.kotlinx: kotlinx-coroutines-android: 1.0.1'

L'absence de cette dépendance pourrait être la raison pour laquelle l'application se bloque sans aucune trace de pile.


1 commentaires

Cela a fonctionné pour moi. Supprimez le signe $ comme ceci: implémentation 'org.jetbrains.kotlinx: kotlinx-coroutines-android: 1.1.1'



-1
votes

Essayez ceci:

try {
    val request = service.getData()
    val response = request.await()
    debugTextView.text =response.toString()
} catch (e: RuntimeException) {
    e.printStackTrace()
} catch (t: Throwable) {
    t.printStackTrace()
}


0 commentaires