0

因为我被这个问题困住了,不知道我的错误在哪里,我需要问你们。当我第一次启动我的应用程序时,一切正常,但是当我按下手机上的“返回”按钮返回主屏幕并再次启动应用程序时(这不是真正的新启动,因为应用程序进入睡眠状态)它有一个真的很奇怪的行为。

我正在使用 opengles 在屏幕上绘制纹理,当我触摸时,纹理会发生变化。触摸将布尔值设置为 true,表示绘制其他纹理。但不知何故,当我测试它的值时它总是错误的,即使它刚刚从触摸事件被写入 true。我想知道,因为只有当我按下手机上的“返回”按钮时才会发生这种情况。当我使用主页按钮返回主屏幕然后返回应用程序时,这件事不会发生并且一切正常。

首先,我认为它与线程 2 个不同的线程(活动渲染线程和用于触摸事件的表面视图线程)有关,但即使在同步所有 get/set 方法时它仍然不起作用。我开始认为触摸线程的东西仍在旧对象上运行并在那里更改值,而渲染线程中的引用被新实例化,因此布尔值由触摸设置,但渲染线程仅采用默认值,因为它们不同对象显然是不可能的。

好吧,我的知识已经结束了,所以请赐教

编辑:好吧,我发现了错误...当设备从睡眠中恢复过来时,它创建了另一个对象(带纹理的正方形),然后触摸事件发生在未删除的旧对象上并绘制了新对象。

如果有人能告诉我从睡眠中恢复时调用了哪些确切的方法,那会很好吗?它只是 onResume 还是还有更多?那么引用呢,它们是否也会被删除,因为不应该创建另一个对象,我什至测试 == null 然后创建一个新对象,但不知何故,当它回来时这似乎是真的

4

1 回答 1

0

作为第二个问题的答案,您可以在此处了解有关活动生命周期的更多信息:http: //developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

我通常做的是让资源管理器知道已加载的内容并处理纹理、模型等的生命周期。当我的应用程序停止或暂停时,资源管理器会卸载资源(当暂停,仅在停止时),当应用程序恢复时,重新加载所有资源并重新生成 OpenGL 上下文(请记住,除非您执行某些操作,即在清单中声明,系统将破坏 OpenGL 上下文)。您需要设置纹理、缓冲对象等。您可以扩展此想法以处理在应用程序生命周期中需要持久化的所有内容。

快乐编码!

于 2013-05-06T05:43:26.157 回答