0

libgdx の render メソッドから 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 は render でデクリメントされる値に依存するため、render から呼び出す必要があります。問題がレンダー スレッドから UI スレッドを呼び出していることは理解していますが (私はそう思います!)、それを解決する方法がわかりません。この投稿から試しました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 の "render" スレッドは Android の "UI" スレッドではないため、Android バックエンドで Android UI スレッド コンテキストを必要とするコードを呼び出すときは、いくつかのフープをジャンプする必要があります。

一般に、解決策はHandler、UI スレッドのコンテキストで を作成し、Runnables をそのオブジェクトにポストすることです。これは、Android UI 要素の統合に関する wiki ページが行っていることです。

Toast実装が正しく機能している場合は、Intentコードも機能するはずです (どちらも Android UI スレッド コンテキストで実行するという同じ要件があります)。

作成している に別の問題がある可能性がありHandlerます (Libgdx コールバック中に作成されていませんcreateか? (それを作成したスレッドに暗黙的に関連付けられています)。または、セットアップの早い段階でこのコードを呼び出していますか? 完全なバックトレース詳細を提供する場合があります。

于 2013-09-18T02:13:51.203 に答える