2011-06-07 109 views
0

我正在開發一個Android應用程序,並且當我第二次啓動應用程序時,出現強制關閉錯誤。以下是我的logcat:強制關閉應用程序的第二次啓動

06-07 16:08:12.763: ERROR/AndroidRuntime(3293): Uncaught handler: thread exiting due to uncaught exception06-07 
16:08:12.773: ERROR/AndroidRuntime(3293): java.lang.NullPointerException06-07 
16:08:12.773: ERROR/AndroidRuntime(3293):  at com.androidpeople.tab.MobiintheMorningActivity$t2.run(MobiintheMorningActivity.java:209)06-07  

16:08:12.773: ERROR/AndroidRuntime(3293): at java.lang.Thread.run(Thread.java:1060) 
+0

不看任何代碼就不能說什麼。 – 2011-06-07 10:46:10

+1

下面的答案是合法的,但也是,下次郵編。 – trgraglia 2011-06-07 10:50:33

+0

@Pragna - >請給出完整的logcat錯誤跟蹤,具體由以下原因引起:error line – 2011-06-07 10:52:17

回答

3

你logcat中捕獲告訴你,在你的源文件MobiintheMorningActivity.java,在線209,你正在使用的對象,它是零。看起來很簡單。

0

爲了防止應用程序崩潰的地方try{//insert code} catch(Exception e){//todo when something fails}

在空指針,嘗試調試程序和定位null

+0

line 209 ...看看那條線上正在使用什麼。 – trgraglia 2011-06-07 10:52:46

0

咦,我覺得我應該給比隊長那些愚蠢的答案,一些有用的意見明顯的傢伙。通常會發生這樣的問題,因爲開發人員不完全瞭解Android應用程序生命週期第二次啓動應用程序時,實際上是重新啓動一個活動,而不是整個應用程序,因此,例如,靜態數據可能會保留之前的活動啓動,即使您收到該活動的onDestroy()事件。如果你創建了任何線程,它們可能保持活着(如果你沒有采取特殊的行動來優雅地阻止它們,這通常不是一件簡單的事情 - 例如在我的例子中,一個線程正在從InputStream.read()讀取數據,阻塞的調用在本地代碼中結束,並且無法通過Thread.interrupt()或通過其他線程中調用的InputStream.close()來中斷它,但這是另一回事)。

因此,從設計角度來看,如果您使用的是線程,則必須記住,您可能會嘗試啓動新線程,而舊線程尚未完成。

當操作系統決定如此,當它需要回收內存時,整個應用程序將被完全銷燬。如果您的應用在後臺運行一些線程,該應用可能會被視爲活着,即使您目前沒有公開活動,該應用可能會避免回收,從而導致某種內存泄漏。這被認爲是一種糟糕的編碼風格。

在你的情況中,線程似乎重用了一些舊數據,你可能希望通過Activity重新啓動來重新初始化這些數據。或者你可能有另一個線程同時從先前的啓動和共享數據運行,並且第二次啓動Activity,並且在第二次啓動Activity時爲第二次啓動線程時初始化它們時讀/寫數據。

因此,您需要確保在第一個線程退出之前不要啓動另一個線程。您可以考慮使用本地服務來實現此目的,但您需要爲後臺活動啓動線程(在應用程序的主要事件線程中不執行這些線程(這對於同一應用程序實例中的服務和活動很常見),或者的AsyncTask。服務簡化了一些事情,因爲它不會被活動開始/結束中斷,因此您可以以某種方式在活動重新啓動之間處理異步進程(在您的線程中)。因此,活動應該提出請求來服務執行長時間工作,並從服務中查詢它的狀態(或者接收通知,例如通過監聽器,對於本地服務來說,這非常合適)。因此,開始一個活動,你應該檢查服務器正在做什麼 - 可能它已經從之前的活動開始執行一項工作。你的活動可能會要求停止工作(如果上一次活動完成時你沒有這樣做),並等待取消工作,這通常可能不是一件快事,應該異步完成)。當然你也可以在沒有服務的情況下實現相同的方法,就在那個線程中。