5

我正在编写一个基本上是 250K JNI 包装器的应用程序。JNI(一个游戏引擎)有一些 API,比如 handle_penUp(int x, int y)。有时它需要从 handle_penUp() 内部查询用户(通过回调到 Java 代码),所以我用来实现查询的对话框必须阻塞。

我知道执行的主线程不能阻塞。因此,我生成了第二个线程,该线程进行所有可能导致需要阻塞的回调的 JNI 调用。在第二个线程中,当我需要建立一个阻塞对话框时,我调用 startActivityForResult(),然后在信号量上调用 acquire()。当 onActivityResult() 在主线程上被调用时,它会在同一个信号量上调用 release()。

如果我的查询是作为一个新的 Activity 实现的,则此方法有效,但如果我想在现有 Activity 中显示对话框()则不行。日志消息告诉我我的线程需要一个 Looper。我正在添加一个 - 并将附加有关它是否有效的信息 - 但感觉好像我在这里走错了路。我需要的是一个做阻塞对话框的秘诀(如果只是因为每个其他平台都有它们,所以移植的代码通常会以这种方式工作,这很有用。)

4

2 回答 2

2

这听起来非常接近我从触摸线程设置可见/不可见某些视图时遇到的问题。

问题是你不能在另一个线程的GUI上做一些操作(这是你的情况)

你需要做的是在你的主线程中使用一个 Handle 我在 Activity 中声明它

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

我选择了 public static 选项,这样我就可以在任何地方访问(因为我一次没有多个调用,而且我懒得将它传递给子类)。

那么您要做的就是向该处理程序发送一条消息,并且由于该处理程序与 gui 位于同一线程中,因此它可以工作^^

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

这应该可以解决您的 looper 错误并允许您将 GUI 请求从一个线程发送到另一个线程

希望能帮助到你

杰森

于 2010-10-27T09:32:20.003 回答
0

您绝对不想要两个 UI 线程。就控制流和显示而言,应该只有一个线程与 Android SDK 通信(即与绘图、启动活动、显示对话框等相关的任何内容)。

另外,请记住,您并不想真正保持线程运行 - 一切都基于事件,因此您希望您的代码响应某事,做某事,然后尽快退出。

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

于 2010-06-29T21:53:18.960 回答