2017-08-04 111 views
1

我有一個奇怪的問題,我已經在Android的初始登錄活動,而它onCreateMethod,被觸發,在這裏我通過對象類,這是一個名爲BaseData靜態對象調用。我得到一個奇怪的空錯誤,而它的一個對象。發現對象在Kotlin中被延遲加載需要一段時間,我如何強制它首先加載並在我的主登錄登錄活動創建時可用。科特林對象加載延遲

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

'在這一步// BaseData本身當屬無效,因此應用程序去blank' - 如果BaseData爲空,' BaseData.userId'會導致NullPointerException。 Kotlin的懶惰對象加載基於JVM類加載 - 你根本不會注意到這種懶惰。 –

回答

0

我有事情的代碼解決。我無法調試也沒有得到錯誤,只是一個普通的黑屏,所以我假設對象是懶加載的,但實際上並不是。另外,在對象初始化函數是怎麼回事,

但墜毀在SharePreferences檢索從JSON發生回科特林對象,但沒有錯誤時,拋出和模擬器黑屏是混亂。在Android Studio中可能更好的調試支持可能有助於這裏和所需的改進範圍。

於是我就以隨機抽樣方式計算表達式,找出問題在getPref方法和atlast加入,而不是幫助,再還學什麼物化的手段,將這樣做不久。

但關閉這些變化在代碼完成後,作爲爲解決該問題如下:

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

實測值的對象是延遲加載在其中科特林需要一段時間

這不是遲緩裝載的裝置。這意味着如果對象不在代碼中使用,它們將不會被分類。如果userId僅與Kotlin代碼交互,則它是不可能的。

+0

嘿我發現了這個問題,你是對的這不是懶加載。問題出在轉換問題之一,就是在共享偏好上保存Json並取回。所以這是通過BaseData的init方法實現的。所以一旦我修好了,從kotlin開始,它開始工作。 –

+0

但是對這種情況的調試並沒有發生,我對這個問題的位置感到困惑,因爲它沒有發現任何調試點。我繼續嘗試使用試錯法直接訪問共享首選項,並在調試過程中評估表達式以查找問題。因此Android的工作室並沒有直接拋出錯誤 –

0

我認爲你不能從BaseData對象的初始化塊訪問共享偏好。

+0

初始化塊的工作,但是在調試流程沒有發生如共享偏好有一個類,我用gson.From將字符串轉換爲科特林對象。 –