0

我正在尝试从 libgdx 中的渲染方法启动 Intent,但出现“无法在未调用 Looper.prepare() 的线程内创建处理程序”错误。

我已经从这里 http://code.google.com/p/libgdx-users/wiki/IntegratingAndroidNativeUiElements3TierProjectSetup实现了接口

我已经使用了 Toast 实现,效果很好。

这是我的 Android 实现

 @Override
public void launchPlayerRoom() {
    Intent intent = new Intent(appContext, RoomViewActivity.class);
    intent.putExtras(selectPlayerRoom());
    startActivity(intent);
}

并从 Libgdx 渲染调用

if (health_amount <= 0){
            actionResolver.launchPlayerRoom();
        }

Intent 需要从渲染中调用,因为它取决于渲染中递减的值。我知道问题是从渲染线程调用 UI 线程(我认为!),但我不知道如何解决它。我从这篇文章中尝试过Can't create handler inside thread that has not called Looper.prepare()

 @Override
public void launchPlayerRoom() {
    final Intent intent = new Intent(appContext, RoomViewActivity.class);
    intent.putExtras(selectPlayerRoom());
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            startActivity(intent);
        }
    });

但这没有什么区别。

非常感激任何的帮助。

4

2 回答 2

2

Libgdx“渲染”线程不是 Android“UI”线程,因此当您在 Android 后端调用需要 Android UI 线程上下文的代码时,您必须跳过一些环节。

一般来说,解决方案是Handler在 UI 线程的上下文中创建一个,然后将 Runnables 发布到该对象。这就是关于集成 android UI 元素的 wiki 页面正在做的事情。

如果您的Toast实现工作正常,那么Intent代码也应该工作(两者都具有在 Android UI 线程上下文上运行的相同要求)。

Handler您正在创建的可能还有其他问题(它不是在 Libgdxcreate回调期间创建的吗?(它与创建它的线程隐式关联。)或者您是否在设置中过早调用此代码?完整的回溯可能会提供更多细节。

于 2013-09-18T02:13:51.203 回答
0

我现在已经整理好了。事实证明,我需要中断渲染线程,然后才能启动意图。当我调用 AlertDialog 并从那里启动意图时,我稍微更改了实现。我接受了答案,因为它让我沿着正确的思路思考。

于 2013-09-18T16:50:21.663 回答