我正在编写一个应用程序,它基本上是250K JNI的包装器。 JNI(游戏引擎)具有handle_penUp(int x,int y)等API。有时它需要从handle_penUp()内部查询用户(通过回调到Java代码),因此我用来实现查询的对话框必须阻止。
据我所知,执行的主线程无法阻塞。所以我已经产生了第二个线程,它使得所有可能导致需要阻塞的回调的JNI调用。在第二个线程中,当我需要建立一个阻塞对话框时,我调用startActivityForResult()然后在信号量上获取()。当在主线程上调用onActivityResult()时,它会在同一个信号量上调用release()。
如果我的查询是作为新的Activity实现的,那么这是有效的,但如果我想在现有的Activity中显示showDialog(),则不行。日志消息告诉我我的线程需要一个Looper。我正在添加一个 - 并将附加有关它是否有效的信息 - 但感觉好像我在这里走错了路。我需要的是一个阻塞对话框的配方(如果只是因为每个其他平台都有它们就很有用,因此移植代码通常会以这种方式工作。)
答案 0 :(得分:2)
这听起来非常接近我从触摸线程设置可见/不可见某些视图的问题。
问题是你不能在GUI上形成一些操作形成另一个线程(这是你的情况)
您需要做的是在主线程中使用句柄 我在活动中声明了它
public static final Handler handlerVisibility = new Handler() {
public void handleMessage(Message msg) {
int visibility = msg.getData().getInt("visibility");
view.setVisibility(visibility);
}
};
我选择了public static选项,以便我可以在任何地方访问(因为我一次没有多一个调用,而且我觉得懒得将它传递给子类)。
那么你想要做的是向这个处理程序发送一条消息,因为Handler与gui工作在同一个线程中^^
Message msg = MainActivity.handlerVisibility.obtainMessage();
Bundle b = new Bundle();
b.putInt("visibility", View.VISIBLE);
msg.setData(b);
MainActivity.handlerVisibility.sendMessage(msg);
这应解决你的looper错误并允许你从一个线程发送GUI请求到另一个
希望有所帮助
杰森
答案 1 :(得分:0)
你绝对不需要两个UI线程。就控制流和显示而言,应该只有一个与Android SDK通信的线程(即与绘图,开始活动,显示对话等有关的任何内容)。
另外,请记住,您不希望实际保持线程运行 - 一切都基于事件,因此您希望代码响应某些内容,执行某些操作,然后尽快退出。
当你说“阻止”时,你究竟是什么意思?需要阻止什么?如果你只需要停止响应事件,为什么没有一个在对话框可见的情况下设置为true的布尔值,并且在它为真时忽略所有事件?