箱子
箱子
  • 发布:2016-04-10 12:32
  • 更新:2016-10-26 16:19
  • 阅读:3391

主线程空指针异常,程序出现假死

分类:5+ SDK

最近开发遇到一个很奇怪的问题,具体描述如下:
1.在webview中,通过main.startActivity方式去调用原生的地图Activity,地图可以正常打开,但是logcat中出现一个error,该error是在地图Activity的oncreate方法之前出现的,但地图可以正常打开,错误信息具体如下:
> 04-10 12:15:05.577 26523-26764/net.feelsky.byfz W/System.err: java.net.SocketException: Socket closed
04-10 12:15:05.577 26523-26764/net.feelsky.byfz W/System.err: at libcore.io.Posix.accept(Native Method)
04-10 12:15:05.577 26523-26764/net.feelsky.byfz W/System.err: at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:55)
04-10 12:15:05.582 26523-26764/net.feelsky.byfz W/System.err: at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98)
04-10 12:15:05.582 26523-26764/net.feelsky.byfz W/System.err: at java.net.ServerSocket.implAccept(ServerSocket.java:203)
04-10 12:15:05.582 26523-26764/net.feelsky.byfz W/System.err: at java.net.ServerSocket.accept(ServerSocket.java:128)
04-10 12:15:05.587 26523-26764/net.feelsky.byfz W/System.err: at io.dcloud.common.util.net.http.LocalServer.run(LocalServer.java:58)
04-10 12:15:05.587 26523-26764/net.feelsky.byfz W/System.err: at java.lang.Thread.run(Thread.java:841)

2.在地图Activity中按回退按钮返回到webview界面,一段时间后程序假死(时间段内没有做过任何操作),并且未捕获到明显的异常,只有以下提示:
> 04-10 12:15:36.107 26523-26523/net.feelsky.byfz W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41594c50)

3.因没有明确提示,自己在SDK_WebApp 类中继承了Thread.UncaughtExceptionHandler接口后,捕捉到一些异常,具体如下:
> 04-10 12:15:36.107 26523-26523/net.feelsky.byfz I/SDK_WebApp: uncaughtException, thread:Thread[main,5,main] name:main id:1 exception: java.lang.NullPointerException
04-10 12:15:36.107 26523-26523/net.feelsky.byfz I/SDK_WebApp: VMStack.java dalvik.system.VMStack getThreadStackTrace -2
04-10 12:15:36.107 26523-26523/net.feelsky.byfz I/SDK_WebApp: Thread.java java.lang.Thread getStackTrace 579
04-10 12:15:36.107 26523-26523/net.feelsky.byfz I/SDK_WebApp: SDK_WebApp.java net.feelsky.byfz.integrate.SDK_WebApp uncaughtException 62
04-10 12:15:36.107 26523-26523/net.feelsky.byfz I/SDK_WebApp: ThreadGroup.java java.lang.ThreadGroup uncaughtException 693
04-10 12:15:36.107 26523-26523/net.feelsky.byfz I/SDK_WebApp: ThreadGroup.java java.lang.ThreadGroup uncaughtException 690
04-10 12:15:36.107 26523-26523/net.feelsky.byfz I/SDK_WebApp: NativeStart.java dalvik.system.NativeStart main -2
04-10 12:15:36.112 26523-26523/net.feelsky.byfz I/SDK_WebApp: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/net.feelsky.byfz-1.apk"],nativeLibraryDirectories=[/data/app-lib/net.feelsky.byfz-1, /vendor/lib, /system/lib, /data/datalib]]]

从异常信息中中发现,main主线程中出现一个空指针异常,导致程序假死,但是 又不知道这个为什么报这个空指针异常,请大神们帮忙,项目比较紧,谢谢大神们~~~~

2016-04-10 12:32 负责人:无 分享
已邀请:

最佳回复

箱子

箱子 (作者)

找到解决方法了,思路如下:

  1. 确定问题是因为内存引起的。
  2. 是在打开地图的时候发现内存大幅增大。
  3. 将地图通过新的进程打开(安卓的机制是每个进程会分配指定内存大小)。
  4. 在AndroidMainfest.xml中的MyMapActivity上添加android:process=":net.feelsky.byfz.tianditu" 即表示该Activity以新进程打开,同时添加android:singleUser="true"(可选),单例模式。
  5. 添加完后,当地图因内存过大而导致崩溃的时候,主进程仍然正常运行,不会导致APP假死。
  6. 因为正常的activity退出后不会关闭进程,然后多次打开地图是内存会缓慢增加,最终导致地图内存超过分配大小而崩溃(主进程正常),那么在activity退出是调用system.exit(0)退出进程。

总结:
调试了两天,虽然一直怀疑是内存问题引起的,但是程序又没有报出内存溢出的错误,所以浪费了很多时间。另外也不熟悉android的内存分配机制,所以一直没有确定是内存原因。但以目前这种方法解决问感觉还不是最好的做法,实际要做的应该是想办法减少内存的消耗,以及及时回收内存。

箱子

箱子 (作者)

尝试了下打开一个空白的Activity,返回一段时间后没有假死现象,那么可能是内存引起的空指针异常?
因为在打开地图后内存有58M多点,而打开空白Activity只有40多兆M。
另外也不一定要返回后才会出现空指针异常,在打开地图频繁操作后也会出现空指针异常。

Aceo

Aceo

能看一下你写的通过main.startActivity方式去调用原生的地图Activity 的完整代码吗

该问题目前已经被锁定, 无法添加新回复