我编写了一个游戏(我将其命名为“Gamer”),其中我具有以下一般结构(代码已大大简化):
public class Gamer extends Activity implements View.OnClickListener
{
public void onCreate(Bundle savedInstanceState)
{
mpt = new MicksPanelThing(this);
}
}
public class MicksPanelThing extends SurfaceView implements SurfaceHolder.Callback
{
public MicksPanelThing(Context context)
{
super(context);
micks_thread_thing = new MicksThreadThing(getHolder(), this);
getHolder().addCallback(this);
setFocusable(true);
}
void updateView()
{
final SurfaceHolder holder = getHolder();
try
{
Canvas canvas = holder.lockCanvas();
if(canvas != null)
{
onDraw(canvas);
holder.unlockCanvasAndPost(canvas);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void onDraw(Canvas canvas)
{
// blah
}
}
class MicksThreadThing extends Thread
{
public MicksThreadThing(SurfaceHolder surfaceHolder, MicksPanelThing mpt)
{
// blah
}
public void run()
{
while (this_thread_is_currently_active)
{
micks_panel_thing.updateView();
}
}
}
游戏一切正常,非常强大。现在我想测试某个条件,如果是真的,就设置一个 AlertDialog。我假设我可以将这段代码放在我的 onDraw 方法中。然后我收到一条消息“无法在未调用 Looper.prepare() 的线程内创建处理程序”——这让我感到困惑,因为我认为 onDraw 方法正在由我认为不需要的主线程执行设置任何东西。
我想我可以通过将我的测试和对话框移动到主线程中的某个地方(在哪里?)或在某个地方添加一些 Looper.prepare() 代码来解决这个问题。
请有人告诉我哪个更容易 - 任何必要的代码应该放在哪里。