从睡眠中回来时Android App奇怪的行为

时间:2013-05-04 23:50:32

标签: java android multithreading opengl-es

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

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

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

嗯,我知道了,所以请赐教我

编辑:嗯我发现了错误......当设备从睡眠状态恢复时,它创建了另一个对象(纹理方块),然后触摸事件发生在旧的没有被删除的新对象上。

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

1 个答案:

答案 0 :(得分:0)

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

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

快乐的编码!