今天我遇到了奇怪的现象
我的应用程序有一个ndk函数,其中一个startStopRecording()
启动和停止视频录制(使用FFMPEG)
当我从常规Android UI按钮或Android MenuOptions调用此功能时,该功能完美运行(在过去3个月内)
但是,当我从连接到glSurfaceView(使用AndEngine创建)的精灵调用此函数时,应用程序冻结(gl表面冻结,但是从菜单选项仍然可以正常运行并且可以在glsurface冻结时进行录制),没有错误,或者我无法复制的致命错误,因为我不再得到它。但是调用的函数是一个总是有效的函数,只是从不同的地方调用。
我的代码:
Spritebutton20 = new Sprite(CAMERA_WIDTH-3*(CAMERA_WIDTH/12), 1*CAMERA_HEIGHT/12, CAMERA_WIDTH/7, CAMERA_HEIGHT/7 ,mCloudTextureRegion, this.getVertexBufferObjectManager()){
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
if(pSceneTouchEvent.isActionDown()){
startStopRecording();
}
return true;
}
};
这真的很奇怪,因为同样的功能在几个月内从Android按钮和菜单中运行良好,但我将所有按钮切换为gl表面(我必须在我的应用程序中使用它来进行高级动画GUI)。
有人知道我在这里缺少什么吗?也许是线程冲突问题?
我试图添加计时器来检查该函数一次只调用一次,但它仍然使应用程序崩溃。
如何调试?
编辑:
这种情况在50%的时间内发生。这意味着它有时会起作用,有时它会冻结
从计算机科学的角度来看 - 有时会发生这种情况,有时甚至不会发生。即使在相同的应用程序运行中,也确实是50/50。
编辑2:
解决了Alex cohn comment.run它在UI线程上足够安全并按预期工作。