간단한 멀티 플레이어 게임을 만들려고합니다. 모든 네트워크 통신을 처리해야하는 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();
}
}
에서210
모든 방법은 다음과 같습니다 처리기의 handleMessage()
방법에서
public void notifyGameRegistered() throws RemoteException
{
handler.dispatchMessage(handler.obtainMessage(CALLBACK_GAME_REGISTERED));
}
내가 간단한 switch(msg.what)
을하고 모든 경우에 (축배를 보여주는, 텍스트 변경 등) 간단한 UI 수정 거기에 있어요.
왜이 예외가 throw되는지 전혀 알 수 없습니다. Runnable
에 코드를 포장하고 runOnUiThread()
을 호출하여 문제를 해결할 수 있지만 여전히 호기심을 유발합니다. Handler가 항상 생성 된 스레드에서 실행해서는 안됩니다. ? 아니면 뭔가 잘못하고있는 걸까요?
글쎄 .. 지금하고 있습니다. 하지만 handleMessage가 두 개의 다른 스레드에서 실행되는 이유는 무엇입니까?일단 UI에 있으면 (notifySocketCreated()) not another (notifyGameRegistered()). – omarcin