第二次开始申请时强制关闭

时间:2011-06-07 10:42:29

标签: android

我正在开发一个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)

3 个答案:

答案 0 :(得分:3)

您的logcat捕获告诉您,在源文件MobiintheMorningActivity.java中,在第209行,您正在使用一个null对象。似乎很直接。

答案 1 :(得分:0)

防止应用程序崩溃try{//insert code} catch(Exception e){//todo when something fails}

在NullPointer上,尝试调试程序并找到null

答案 2 :(得分:0)

嗯,我觉得我应该提供一些有用的评论,而不是那些明显的研究员那些愚蠢的回答。通常会出现此类问题,因为开发人员并未完全了解Android应用程序生命周当您第二次启动应用程序时,实际上您重新启动一个Activity,而不是整个Application,因此例如静态数据可能会保留以前的活动启动,即使您收到该活动的onDestroy()事件。如果你创建了任何线程,它们可能仍然存活(如果你没有采取特殊的行动来优雅地停止它们,这通常不是一件容易的事情 - 例如在我的情况下,一个线程正在从InputStream.read()读取数据,阻塞调用以本机代码的某个地方结束,并且无法通过Thread.interrupt()或通过其他线程调用的InputStream.close()来中断它。但这是另一个故事。)

因此,从设计的角度来看,如果你正在使用线程,你必须记住,你可能正在尝试启动一个新线程而旧的线程尚未完成。

当操作系统决定,当需要回收内存时,整个应用程序将被完全销毁。如果您的应用程序在后台运行某些线程,则该应用程序可能会被视为活动,即使您此刻没有打开活动,该应用程序可能会避免回收,从而导致某种内存泄漏。这被认为是一种糟糕的编码风格。

在您的情况下,线程似乎重用了一些旧数据,您可能希望通过Activity重新启动来重新初始化这些数据。或者您可能有另一个线程从先前的启动同时运行并与第二次启动的Activity共享数据,并且当您在Activity的第二次启动时初始化它们时,它会读取/写入数据,用于第二次启动该线程。 / p>

因此,您需要确保在第一个线程退出之前不启动另一个线程。您可以考虑将本地服务用于此类目的,但是您需要为后台活动启动线程(不在应用程序的主事件线程中执行它们,这对于同一Application实例中的服务和活动是常见的),或者的AsyncTask。服务简化了一些事情,因为它不会被活动开始/结束中断,因此您可以以某种方式处理活动重启之间的异步过程(在您的线程中)。因此,活动应该将请求发送到服务以执行长作业,并从服务中查询其状态(或接收通知,例如通过侦听器,这对本地服务来说非常好)。因此,启动一个活动,您应该检查服务器正在做什么 - 可能它已经从之前的活动开始执行作业。您的活动可能会要求停止作业(如果您在之前的活动完成时尚未执行此操作),并等待取消作业,这通常可能不是一件快事,应该异步进行。当然,您可以在没有服务的情况下实现相同的方法,只需在该线程中即可。