【问题标题】:Blocking Dialog from within JNI code从 JNI 代码中阻止对话框
【发布时间】:2010-01-16 14:48:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: java android java-native-interface android-ndk


    【解决方案1】:

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

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

    你需要做的是在你的主线程中使用一个句柄 我在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 请求从一个线程发送到另一个线程

    希望对你有帮助

    杰森

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 可能会阻塞,就像阻塞与非阻塞 io 一样(调用在获得请求的输入或失败之前不会返回,与立即返回并报告任何输入(如果有的话)缓冲区)
      猜你喜欢
      • 2016-05-27
      • 1970-01-01
      • 2016-02-09
      • 2014-01-24
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多