好的,我尝试了“我能找到的所有内容”并阅读了我搜索过的所有内容,问题很简单,但我无法理解问题所在。
我正在使用NDK(CPP中的本机代码)。
我有一个非常简单的Activity,它有一个OpenGL GLSurfaceView,在那里完成了一些非常简单的渲染,在某些时候我希望能够用两个按钮打开一个简单的AlertDialog。
现在我尝试了许多不同的方法,从根本上说都是“消息”的概念 发布到Java线程,它只是轮询消息,然后当它收到消息时,它会将带有Handler的消息发布到主UI线程,该线程运行创建AlertDialog的消息处理程序“。
我尝试了一些其他的方法,包括只是做 - 测试 - “所有来自Java”,通过在GLSurfaceView的onTouchEvent()函数内向Handler发布消息,如下面的代码片段所示:
@Override
public boolean onTouchEvent(MotionEvent e) {
/* code to get the events .. */
if ( maskedAction == MotionEvent.ACTION_DOWN && isUiOn == false)
{
isUiOn = true;
GilesTest2JNIActivity.theHandler.sendEmptyMessage(1);
}
return true;
}
接收消息的处理程序执行此操作:
public class GilesTest2JNIActivity extends Activity {
GilesTest2JNIView mView;
public static AlertDialog mTextInputDialog;
private Context MyContext;
public static Handler theHandler;
public LayoutInflater mInflater = null;
public Handler mHandler;
@Override protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
Log.i ("Giles OnCreate ","creating appl.");
MyContext = this;
mInflater = (LayoutInflater) getSystemService(MyContext.LAYOUT_INFLATER_SERVICE);
mHandler = new Handler(){
public void handleMessage(Message msg){
AlertDialog.Builder builder = new AlertDialog.Builder(MyContext);
Log.i ("handler","builder");
builder.setView(mInflater.inflate(R.layout.dialog_signin, null));
builder.setTitle("User - Login");
builder.setMessage("Please enter your username and pwd");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
GilesTest2JNILib.nativeSendInputText( "BBB", "AAA");
//dialog.dismiss();
mView.isUiOn = false; // signal this is OFF
}
} );
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
Log.w ("Keyboard","Kb is going away via CANCEL");
GilesTest2JNILib.nativeSendInputText( "**", "**" );
mView.isUiOn = false; // signal this is OFF
}
});
mTextInputDialog = builder.show();
mTextInputDialog.setCanceledOnTouchOutside(false);
mView.isUiOn = true; // signal this is ON
}
};
/* rest of onCreate() .. */
}
AlertDialog出现的情况似乎一切正常,但是几秒钟之后一切都冻结了,没有错误信息,没有,但即使GLSurfaceView()上的渲染也停止,因为.step()不会被调用更多,一切都冻结停止,没有显示任何类型的任何错误消息,并几乎永远停留在那里和/或偶尔进入“应用程序无响应”。
这种行为似乎发生在Nexus 7平板电脑上,但在另一台平板电脑上我没有发生但是在第4或第5次我启动/关闭对话框之后。
我唯一能够理解的东西似乎在某些方面停止接受各种触摸和/或它就像“没有窗口”和/或某些窗口消失了,真的我无法弄清楚发生了什么
我正在重新添加一些我在广泛测试后发现的信息。
获得经典的基本OpenGL示例之后,简单地绘制一个三角形并将所有代码放回去的人发现它一切正常,所以回到原点并在我的代码上重新尝试相同的我开始放#ifdef在各个地方切掉一些代码,直到找到'崩溃点'。
经过一段时间后,我发现了这一点,看起来它根本不在那段代码中,但与我在后台工作的音频有关。
这是一个非常简单的基于OpenSL和一个播放器对象的播放器,它在循环中连续播放循环缓冲区,其中混合了样本,似乎所有这些都归结为这段代码:
// at this point we can enqueue the current chunk for playing
theSize = AUDIO_DATA_CHUNK_SIZE*sizeof(SLint16);
#define DO_NOT_ENQUEUE 1
#ifndef DO_NOT_ENQUEUE
result = (*bq)->Enqueue(bq, (void*) curdata, theSize ); /* Size given in bytes. */
#endif
AUDIO_DATA_CHUNK_SIZE为128,该东西设计为循环播放循环缓冲区,其中混合了样本,它不断播放(采样率11.025 Khz)。
如果我在Alertdialog启动时禁用播放声音,一切都会完美无缺。
不知道究竟发生了什么,除非在某些时候你可以看到这种情况发生:
12-19 18:56:52.418: W/InputConnectionWrapper.ICC(303): Timed out waiting on IInputContextCallback
12-19 18:56:52.418: I/InputDispatcher(150): Dropped event because it is stale.
12-19 18:56:52.418: I/InputDispatcher(150): Dropped event because it is stale.
12-19 18:56:52.418: I/InputDispatcher(150): Dropped event because it is stale.
似乎在某种程度上音频播放会干扰输入。