首页 / 浏览问题 / 移动GIS / 问题详情
android 第二次打开场景闪退
3EXP 2019年05月08日
使用产品:supermap-imobile-9.1.1-168-android

问题描述:将官方文档中的飞行管理(FlyMannger)demo导入成一个module,添加一个入口主界面。

第一次进入FlyMannger的MainActivity,三维场景可正常加载。

点击back回到入口主界面,第二次进入FlyMannger的MainActivity时,发生闪退。

APP销毁过,重新进入则没有问题。

问题总结:第二次打开Activity时,会发生闪退,必现。

                APP进程退出后,第一次打开activity时,正常

猜测可能与资源的销毁或回收有关

以下是报错日志

2019-05-08 11:13:47.547 22044-22044/com.example.po.myapplication332 V/AudioManager: playSoundEffect   effectType: 0
2019-05-08 11:13:47.556 22044-22105/com.example.po.myapplication332 W/hwaps: APS: null pointer in reset
2019-05-08 11:13:47.595 22044-22044/com.example.po.myapplication332 D/HwCust: Create obj success use class android.app.HwCustActivityImpl
2019-05-08 11:13:47.596 22044-22044/com.example.po.myapplication332 D/HwCust: Create obj success use class android.app.HwCustHwWallpaperManagerImpl
2019-05-08 11:13:47.598 22044-22044/com.example.po.myapplication332 V/ActivityThread: ActivityThread,callActivityOnCreate
2019-05-08 11:13:47.612 22044-22044/com.example.po.myapplication332 D/HwRTBlurUtils: check blur style for HwPhoneWindow, themeResId : 0x7f0f0007, context : com.supermap.flymanager.MainActivity@3a61a0c, Nhwext : 0, get Blur : disable with , null
2019-05-08 11:13:47.615 22044-22044/com.example.po.myapplication332 D/ActivityThread: add activity client record, r= ActivityRecord{e08b40d token=android.os.BinderProxy@194f13f {com.example.po.myapplication332/com.supermap.flymanager.MainActivity}} token= android.os.BinderProxy@194f13f
2019-05-08 11:13:47.620 22044-22105/com.example.po.myapplication332 D/OpenGLRenderer:   HWUI Binary is  enabled
2019-05-08 11:13:47.629 22044-22044/com.example.po.myapplication332 I/PressGestureDetector: onAttached begin
2019-05-08 11:13:47.630 22044-22044/com.example.po.myapplication332 I/PressGestureDetector: onAttached end
2019-05-08 11:13:47.632 22044-22330/com.example.po.myapplication332 I/PressGestureDetector: enabledInPad = false,isPcCastMode = false
2019-05-08 11:13:47.657 22044-22105/com.example.po.myapplication332 D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, egl_color_buffer_format *, EGLBoolean) returns 0x3000
2019-05-08 11:13:47.679 22044-22329/com.example.po.myapplication332 E/OGRE: OGRE EXCEPTION(2:InvalidParametersException): NativeWindowType with name '00000000' already exists in GLES2RenderSystem::_createRenderWindow at E:\AR\OGRE1.9_ES3\RenderSystems\GLES2\src\OgreGLES2RenderSystem.cpp (line 526)
2019-05-08 11:13:47.687 22044-22195/com.example.po.myapplication332 A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4498 in tid 22195 (Thread-10)
2019-05-08 11:13:47.687 22044-22105/com.example.po.myapplication332 D/OpenGLRenderer:   HWUI Binary is  enabled
2019-05-08 11:13:47.730 22044-22044/com.example.po.myapplication332 W/InputMethodManager: startInputReason = 1

1个回答

你好,这是由于你在返回到主界面,其实你的进程还在。第二次进去就会导致闪退。你可以在返回到主界面时将资源全部释放掉
9,242EXP 2019年05月08日

 @Override
    protected void onDestroy() {
        if (scene != null) {
            scene.close();
            scene.dispose();
        }
        super.onDestroy();
    }

dispose报错,java.lang.UnsupportedOperationException: dispose()

只有close不管用,下次再进入时,还是会闪退?

所以释放资源的正确姿势是。。。。???

你在你的返回建的事件中将FlyMannger关掉。下次进入的时候重新打开场景
额 我感觉并不是FlyMannger的原因

因为我在demo中屏蔽FlyMannger相关功能之后,还是有这个问题。

其实我在scene相关的demo中都遇到了这个问题,这里只是拿飞行管理demo举了个例子。

比如打开本地数据(OpenLocalData)这个demo,仅仅是加载本地场景,并没有任何附加功能,也会出现第二次打开闪退的问题。

其他的2d地图demo里,没有看到释放资源的相关代码,但是重复打开就不会出现类似问题。

能否提供一下关闭3d场景,释放相关资源的正确姿势?
根本没用FlyManager,第二次进闪退,close没有用
FlyMannger如何关闭
你好,你可以在配置文件里面,设置场景的activity的启动模:android:launchMode="singleTask" ,然后在跳转的时候返回事件里面跳转到MainActivity
这样肯定不行,如果不是从MainActivity进去的呢,要返回到其他子页面呢?
如果用back键返回到上一级页面这个不好控制,因为每款手机可能back键返回的资源都不一样。所以需要用按钮来进行返回,在返回的事件写跳转到哪个页面的方法
你说的是在场景activity添加启动模式?

这样的话场景是单例,重新启动的话,会使用上次加载好的场景,并不是重新加载的场景。

如果在入口activity添加启动模式,那么对场景activity来说和之前的模式没有任何区别。

这个通过启动模式去处理的解决方案感觉是绕道了,而且不灵活。

scene或者sceneControl没有自己的一套销毁资源的方法么?
就是在返回的时候还是会保存之前使用的场景,用这种方式就是因为在重构activity时资源没有销毁才使用的这个绕行的方案
还有没有别的方式,使第二次之后的每一次进入可以重新加载场景,而不是使用之前加载好的场景。
如果你不想要之前加载好的场景,你可以在返回时将场景中的数据关闭下次再打开
那么如何关闭数据呢?请给一下代码示例~
scene.close;scene.dispose。具体的可以参考帮助文档

额  我在第一次回复你的时候用过这个方法。。。。

dispose方法报错,java.lang.UnsupportedOperationException: dispose()

只执行close方法没有效果。

先dispose和先close,都尝试过,结果都一样,该报错报错,该无效还是无效

下面几行代码任意排列组合,都是一样的结果

 @Override
    protected void onDestroy() {
        sceneControl.setVisibility(View.GONE);
        mLayout.removeView(sceneControl);
        if (scene != null) {
            // scene.dispose();  报错
            scene.close();
        }
        if (workspace != null) {
            workspace.dispose();
            // workspace.close();  报错
        }
        super.onDestroy();
    }

你不需要把场景控件移除了啊,你在你返回的事件里面写scene.close;scene.dispose

大哥  我说的scene.dispose报错。。。。。。

onBackPressed和onDestroy都一样,加不加remove都一样,都是报错

而且不加scene.dispose,只有scene.close,还是有问题,还是有问题,还是有问题

我这边测试了dispose这个方法确实有问题,直接将场景关闭就可以了,这是scene也不会消耗资源了。在方法里面这样写:

scene.close();

scene.viewEntire();

scene.refresh();
我这边很尴尬 再次进入依然无法加载场景  我的是荣耀8全网通 emui8.0  应该和手机没关系吧?

每次出错的时候都有下面这句log

E/OGRE: OGRE EXCEPTION(2:InvalidParametersException): NativeWindowType with name '00000000' already exists in GLES2RenderSystem::_createRenderWindow at E:\AR\OGRE1.9_ES3\RenderSystems\GLES2\src\OgreGLES2RenderSystem.cpp (line 526)

你的demo可以重新加载场景么?  能否给我发一下371722487@qq.com
兄弟  总结了一下

1 场景界面要加singletask

2 退出的时候执行scene.close(); 不要销毁activity

3 后面进入activity会执行onNewIntent,在里面写第二次之后的加载场景的逻辑

目前就只能这么解决了~ 明天再试试动态加载场景。

你有其他的解决方案也可以分享给我~~
当个界面可以Activity,但是对应Fragment模式加载三维场景,跳转到其他Fragment,Fragment视图被销毁,回来也报错,又当如何解决?
...