2011-06-07 113 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。服务简化了一些事情,因为它不会被活动开始/结束中断,因此您可以以某种方式在活动重新启动之间处理异步进程(在您的线程中)。因此,活动应该提出请求来服务执行长时间工作,并从服务中查询它的状态(或者接收通知,例如通过监听器,对于本地服务来说,这非常合适)。因此,开始一个活动,你应该检查服务器正在做什么 - 可能它已经从之前的活动开始执行一项工作。你的活动可能会要求停止工作(如果上一次活动完成时你没有这样做),并等待取消工作,这通常可能不是一件快事,应该异步完成)。当然你也可以在没有服务的情况下实现相同的方法,就在那个线程中。