2014-09-04 75 views
5

我正在使用LibGDX。當我的應用程序啓動時,它會創建一個屏幕。當屏幕被加載時,它調用一個靜態函數Module.createStyles()僅在某些Samsung Galaxy設備上出現NullPointerExceptions?

該函數創建了一系列將在整個應用程序中使用的樣式(內置LibGDX樣式,如WindowStyle,LabelStyle,TextButtonStyle - 用於創建用戶界面對象的所有類型的東西)。

當屏幕完成時,它調用Module.disposeStyles()

總之,根據我的谷歌分析崩潰報告,我隨意嘗試,例如,創建一個對話框,Module.dialogStyle時得到NullPointerException異常

ExitDialog exitDialog = new ExitDialog("Are you sure?", Module.dialogStyle);

Thread: GLThread 2089, Exception: java.lang.IllegalArgumentException: style cannot be null. 
at package.Window.setStyle(Window.java:181) 
at package.Window.<init>(Window.java:63) 
at package.Dialog.<init>(Dialog.java:65) 
at package.ExitDialog$1.<init>(ExitDialog.java:38) 

絕對沒有理由Module.dialogStyle應該爲空。我唯一將這個字段置爲空的地方是Module.disposeStyles(),這個函數只在應用程序的一個特定位置(在最後)被調用。

我認爲這是我的代碼中的一個錯誤,儘管有95%的用戶從未體驗過它。然而,那些經歷都在5%似乎是銀河的用戶,我不知道這是一個巧合:

  • 銀河S4
  • 的Galaxy S III
  • Galaxy Tab的3精簡版

任何人有任何想法?不要Galaxy設備有內置的RAM管理器?這與這有什麼關係?

+2

大概垃圾收集是新的和改進是銀河系中最讓設備始終比競爭對手更多的RAM 。一般來說,我有問題(沒有銀河系),它將代碼保存在全局域中。一旦這些被刪除,許多問題就消失了。此外,我不再使用onDispose onDestroy,我在onStop中進行所有清理。 – danny117 2014-09-04 21:50:01

+0

不知道爲什麼你的風格突然用Galaxy設備指向null,如果不在這些設備上測試它,可能很難弄清楚。您可以在創建對話框之前爲樣式添加空檢查,對於空樣式的情況,添加更多信息時觸發Google Analytics事件。 (並且沒有對話框退出屏幕..)這樣至少用戶沒有真正注意到這個錯誤,你仍然可以繼續跟蹤它。 – donfuxx 2014-09-04 22:28:21

回答

4

我要去假設:

Module.dialogStyle 

是對Modulestatic屬性的引用。

您可能會遇到Android管理JVM生命週期的副作用。有些場景(尤其是在較大的設備上)會導致JVM實例重用,從而導致問題(例如,靜態初始化器已經運行,並且不會重新運行)。或者,static指針可能會從先前的應用程序運行到下一個應用程序,並且可能在其中存在無效或不正確的狀態。這取決於您的應用程序的組織方式。

如果您包含更多顯示如何以及何時初始化靜態字段的代碼,我們可以將其計算出來。

有關不同的生命週期,以及如何重現他們在當地的詳細信息,請參閱: http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/

+0

是的,你說的是一個靜態屬性。有趣的是,我不知道只有部分應用程序可以在內存中受到損害,我認爲這是一切或沒有。當我調用'onResume()'並驗證它們仍然存在時,我想我可以逃避檢查這些靜態成員。 – FTLRalph 2014-09-05 11:36:45

相關問題