Android AlertDialog在显示后几秒钟冻结应用程序 - 原因似乎与OpenSL相关

时间:2012-12-07 13:45:22

标签: android android-ndk alertdialog freeze opensl

好的,我尝试了“我能找到的所有内容”并阅读了我搜索过的所有内容,问题很简单,但我无法理解问题所在。

我正在使用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.

似乎在某种程度上音频播放会干扰输入。

0 个答案:

没有答案