シンプルなマルチプレイヤー ゲームを作成しようとしています。すべてのネットワーク通信を処理することになっている がありWorkerService
、このサービスとアクティビティ間のすべてのやり取りは AIDL で行われます。これは標準的なアプローチだと思います-双方向のやり取りを可能にするために、IWorkerCallback
インターフェイス(AIDLも)も使用します。
問題は、コールバックが UI スレッドでのみ実行できる UI の変更を行う必要があることです。私はHandler
(UI スレッドで) を作成しましたが、これは明らかな解決策であると信じています。しかし、驚くべきことに、それは機能していません。
インターフェイスのメソッドをLoungeActivity
呼び出します。私の対応するメソッドは、何らかの仕事をしてコールバックを行います - これはうまくいきます。次に、新しいスレッドを生成し、このスレッドからコールバックすると、不適切な例外がスローされます。startServer()
IWorker
WorkerService
WorkerService
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 は常にそれを作成したスレッドで実行されるべきではありませんか? それとも、私は何か間違ったことをしていますか?