我正在开发一个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 :(得分:3)
您的logcat捕获告诉您,在源文件MobiintheMorningActivity.java中,在第209行,您正在使用一个null对象。似乎很直接。
答案 1 :(得分:0)
防止应用程序崩溃try{//insert code} catch(Exception e){//todo when something fails}
在NullPointer上,尝试调试程序并找到null
答案 2 :(得分:0)
因此,从设计的角度来看,如果你正在使用线程,你必须记住,你可能正在尝试启动一个新线程而旧的线程尚未完成。
当操作系统决定,当需要回收内存时,整个应用程序将被完全销毁。如果您的应用程序在后台运行某些线程,则该应用程序可能会被视为活动,即使您此刻没有打开活动,该应用程序可能会避免回收,从而导致某种内存泄漏。这被认为是一种糟糕的编码风格。
在您的情况下,线程似乎重用了一些旧数据,您可能希望通过Activity重新启动来重新初始化这些数据。或者您可能有另一个线程从先前的启动同时运行并与第二次启动的Activity共享数据,并且当您在Activity的第二次启动时初始化它们时,它会读取/写入数据,用于第二次启动该线程。 / p>
因此,您需要确保在第一个线程退出之前不启动另一个线程。您可以考虑将本地服务用于此类目的,但是您需要为后台活动启动线程(不在应用程序的主事件线程中执行它们,这对于同一Application实例中的服务和活动是常见的),或者的AsyncTask。服务简化了一些事情,因为它不会被活动开始/结束中断,因此您可以以某种方式处理活动重启之间的异步过程(在您的线程中)。因此,活动应该将请求发送到服务以执行长作业,并从服务中查询其状态(或接收通知,例如通过侦听器,这对本地服务来说非常好)。因此,启动一个活动,您应该检查服务器正在做什么 - 可能它已经从之前的活动开始执行作业。您的活动可能会要求停止作业(如果您在之前的活动完成时尚未执行此操作),并等待取消作业,这通常可能不是一件快事,应该异步进行。当然,您可以在没有服务的情况下实现相同的方法,只需在该线程中即可。