2017-08-04 1 views
1

J'ai un problème étrange, j'ai une activité de connexion initiale dans Android, tandis que sur onCreateMethod de celui-ci, est déclenché, où j'ai appelé par Object classe qui est un objet statique nommé BaseData. J'obtiens une étrange erreur nulle, alors que c'est un objet. Trouvé que les objets sont paresseux chargés dans Kotlin qui prend un certain temps, comment puis-je le forcer à charger d'abord et être disponible lorsque mon activité de connexion Landing principal est créé.Kotlin Objets de chargement de retard

class LoginActivity : BaseActivity() { 
override fun onCreate(savedInstanceState: Bundle?) { 
    if(BaseData.userId == “”) { //At this step BaseData itself comes as null, so app goes blank 
     //Do something 
    } 
    } 
} 

object BaseData : Observable() { 
var initialSyncDone:Boolean = false 
var isOffline:Boolean = true 
var userId: String = “” 

init{ 
    // I have logic to load userId from shared preferences 
} 
} 
+0

'// A cette étape BaseData lui-même vient comme nulle, si l'application va blank' - si BaseData était nulle,' BaseData.userId' provoquerait NullPointerException. Le chargement de l'objet paresseux de Kotlin est basé sur le chargement de la classe JVM - vous ne remarquerez pas ce labyrinthe du tout. –

Répondre

0

J'avais des choses résolues avec le code. Je n'ai pas été capable de déboguer ni d'avoir d'erreur, juste un écran noir, donc j'ai eu l'hypothèse que les objets sont chargés paresseux, mais en fait pas. Il y avait aussi une fonction init dans l'objet,

Mais le crash se produisait lors de la récupération de SharePreferences de json à l'objet Kotlin, mais aucune erreur ne s'est produite et l'écran noir sur le simulateur était la confusion. Peut être un meilleur support de débogage dans Android Studio peut aider ici et la portée de l'amélioration nécessaire. Donc je suis allé au hasard à travers des expressions d'évaluation, pour identifier le problème était à la méthode getPref et atlast ajouter au lieu de aidé, encore à étudier ce que signifie réifié, le fera bientôt.

Mais la fermeture de la question comme résolue après ces changements dans le code fait comme suit:

class LoginActivity : BaseActivity() { 
override fun onCreate(savedInstanceState: Bundle?) { 
BaseData.loadPrefData() 
if(BaseData.userId == “”) { 
    //Do something 
    } 
} 
} 

object BaseData : Observable() { 
var initialSyncDone:Boolean = false 
var isOffline:Boolean = true 
var userId: String = “” 

fun loadPrefData // init works but debugging was not happening so no errors before 
{ 
    if(Preferences.pref!!.contains("user")) { 
    userId = if(Preferences.getPref<User>("user") != null) Preferences.getPref<User>("user")!!.id!! else "" 
} 
} 

// Preference class get from SharePreferences 
// **reified** was the missing one, i didn't had before, so it was 
// crashing to convert from Preferences back to Kotlin Object, but no debug errors. 
inline fun <reified T> getPref(key:String) : T?{ 
    val gson = Gson() 
    val jsonString = pref!!.getString(key,"") 
    if(jsonString != "") { 
     val type = object : TypeToken<T>() {}.type 
     return gson.fromJson<T>(jsonString, type) 
    } 
    else 
     return null 
} 
0

Constaté que les objets sont paresseux chargés dans Kotlin qui prend un certain temps

Ce n'est pas ce que signifie le chargement paresseux. Cela signifie que les objets ne seront pas chargés en classe s'ils ne sont pas utilisés dans le code. Il est impossible que userId soit nul s'il n'interagit qu'avec le code de Kotlin.

+0

Hey j'ai trouvé le problème et vous avez raison ce n'est pas paresseux de chargement. Problème avec l'un des problèmes de conversion avec la sauvegarde de Json sur les préférences partagées et la récupération. Donc, cela se passait grâce à la méthode init de BaseData. Donc, une fois que j'ai corrigé, gson.From à kotlin, ça a commencé à fonctionner. –

+0

Mais le débogage sur ce cas n'était pas en train de se faire, j'ai été confondu avec l'endroit où le problème, comme aucun des points de débogage il a frappé. Je suis allé sur la méthode d'essai et d'erreur accédant directement aux préférences partagées et évaluant l'expression au milieu du débogage pour trouver le problème. Donc, le studio Android ne lançait pas d'erreur directement –

0

Je pense que vous ne pouvez pas accéder à la préférence partagée à partir du bloc init de l'objet BaseData.

+0

Le bloc Init fonctionne, mais le flux de débogage ne se produisait pas car les préférences partagées avaient une classe et j'utilisais gson.From pour convertir la chaîne en objet kotlin. –