2010-01-16 122 views
5

内我正在写一个应用程序,基本上是围绕一个250K JNI的包装阻止对话框。 JNI(游戏引擎)具有类似handle_penUp(int x,int y)的API。有时它需要从handle_penUp()内部(通过回调到Java代码)查询用户,因此我用来实现查询的对话框必须被阻止。从JNI代码

据我了解,执行的主线程不能阻止。所以我产生了第二个线程,它使得所有可能导致需要阻塞的回调的JNI调用。在第二个线程中,当我需要建立阻塞对话框时,我调用startActivityForResult(),然后在信号量上获取()。当onActivityResult()在主线程上被调用时,它调用同一信号量上的release()。

如果我的查询将作为一个新的活动来实现,但如果我想将现有的活动范围内的ShowDialog()这工作。日志消息告诉我我的线程需要Looper。我添加了一个 - 并会附加信息是否可行 - 但感觉好像我在这里走错了路。我需要的是做阻挡对话框配方(有用的,如果仅仅是因为所有其他平台拥有他们,因此移植的代码往往会这样的。)

回答

0

你肯定不希望两个UI线程。就控制流程和显示而言(即与绘图,启动活动,显示对话框等有关的任何内容),应该只有一个与Android SDK进行通信的线程。

另外,请记住,你不想竟让你的线程运行 - 一切基于事件,所以你希望你的代码来响应的东西,做一些事情,然后尽快离开。

当你说“块”时,你究竟是什么意思?什么需要被阻止?如果你只需要停止响应事件,为什么不在对话框可见的时候将布尔值设置为true,并且在它为真时忽略所有事件?

+0

可能阻止在拦截与非阻塞IO(电话之前,不会返回它已经获得了请求的输入或失败,与立即返回并报告任何输入(如果已经在缓冲区中) – 2010-09-24 04:47:03

2

听起来非常接近一个问题,我与来自触摸线程设置有形/无形的一些看法。

的问题是,你不能做对GUI的一些操作形成另一个线程(这是你的情况下)

你需要做的是在你的主线程使用手柄 我宣布它在活动

public static final Handler handlerVisibility = new Handler() { 
    public void handleMessage(Message msg) { 
     int visibility = msg.getData().getInt("visibility"); 
     view.setVisibility(visibility); 
    } 
}; 

我选择公共静态,这样我可以在任何地方访问的选项(因为我从来没有在一个时间一个以上的电话,我觉得懒得把它传递到子类)。

那么你想做的事就是将消息发送到该处理程序,并因为处理程序是在同一个线程,因为它的工作原理^^

Message msg = MainActivity.handlerVisibility.obtainMessage(); 
    Bundle b = new Bundle(); 
      b.putInt("visibility", View.VISIBLE); 
    msg.setData(b); 
      MainActivity.handlerVisibility.sendMessage(msg); 

的图形用户界面,应该解决您的尺蠖的错误,让你从一个线程发送GUI请求另一个

希望它有助于

杰森