我正在尝试创建一个简单的多人游戏。有一个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));
}
在处理程序的handleMessage()
方法中,我正在做一个简单的switch(msg.what)
,并且在每种情况下都有一个简单的 UI 修改(显示 Toast,更改文本等)。
我不知道为什么会抛出这个异常。我已经设法通过将代码打包到 aRunnable
并调用来修复它,runOnUiThread()
但它仍然让我很好奇 - 处理程序不应该总是在创建它的线程中运行吗?或者也许我做错了什么?