1

シンプルなマルチプレイヤー ゲームを作成しようとしています。すべてのネットワーク通信を処理することになっている がありWorkerService、このサービスとアクティビティ間のすべてのやり取りは AIDL で行われます。これは標準的なアプローチだと思います-双方向のやり取りを可能にするために、IWorkerCallbackインターフェイス(AIDLも)も使用します。

問題は、コールバックが UI スレッドでのみ実行できる UI の変更を行う必要があることです。私はHandler(UI スレッドで) を作成しましたが、これは明らかな解決策であると信じています。しかし、驚くべきことに、それは機能していません。

インターフェイスのメソッドをLoungeActivity呼び出します。私の対応するメソッドは、何らかの仕事をしてコールバックを行います - これはうまくいきます。次に、新しいスレッドを生成し、このスレッドからコールバックすると、不適切な例外がスローされます。startServer()IWorkerWorkerServiceWorkerService

Can't create handler inside thread that has not called Looper.prepare()

明確にするためのコードを次に示します。

startServer()実装:

private void startServerImpl(String name, float latStart, float latEnd,
float lonStart, float lonEnd)
{
    // some instructions here

    // this works fine:
    callback.notifySocketCreated();

    // my naughty thread:
    new ServerThread().start();

    // some instructions here
}

ServerThreadコード:

private class ServerThread extends Thread {
    @Override
    public void run()
    {
        //some instructions here

        // this call will cause an error
        callback.notifyGameRegistered();

    }
}

のすべてのメソッドはcallback次のようになります。

public void notifyGameRegistered() throws RemoteException
{
    handler.dispatchMessage(handler.obtainMessage(CALLBACK_GAME_REGISTERED));
}

Handler のhandleMessage()メソッドでは単純なことを行ってswitch(msg.what)おり、どの場合でも単純な UI の変更 (トーストの表示、テキストの変更など) があります。

この Exception がスローされる理由がわかりません.コードを に詰め込んRunnableで呼び出すことで修正できましrunOnUiThread()たが、それでも気になります. Handler は常にそれを作成したスレッドで実行されるべきではありませんか? それとも、私は何か間違ったことをしていますか?

4

3 に答える 3

1

これが少し遅れていることは承知していますが、問題はあなたが に電話したことですdispatchMessage()

正しい方法はsendMessage().

dispatchMessage()handleMessage()同じスレッドで呼び出されます。

問題は、ハンドラーが間違ったスレッドにあることではなく、UI が onHandle() メソッドのどこかにハンドラーを作成しようとしていると推測しています。onHandle() が間違ったスレッドで呼び出されるため、例外が発生します。

/**
 * Handle system messages here.
 */
public void dispatchMessage(Message msg)
{
    if (msg.callback != null) {
        handleCallback(msg);
    } else {
        handleMessage(msg);
    }
}
于 2011-07-06T04:56:37.577 に答える
0

UIを変更する機能は、UIを所有するアクティビティに含まれている必要があります。

このリンクはあなたを助けるはずです:http: //android-developers.blogspot.com/2009/05/painless-threading.html

于 2010-10-01T19:29:47.080 に答える
0

どういうわけか、メインスレッドから問題のある関数を呼び出す必要があります。

于 2010-05-04T22:26:20.370 に答える