您好我正在尝试制作一个多人游戏,它会在另一个线程中找到对手,但我不确定为什么线程中运行的代码不会更新主类中的模型......
这是主类中的代码。对LoadTask的调用启动了另一个线程
// Start model, passing number of words, user name, and selected animal
model = new MultiPlayerModel(NUM_WORDS, username, anmID);
model.addObserver(this);
new LoadTask().execute();
setContentView(R.layout.activity_multi_player);
initialDisplay(animal, background, oppAnimal);
这是线程类的代码
private class LoadTask extends AsyncTask<Void, Integer, Void> {
// called before running code in a separate thread
private boolean quitFlag;
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(MultiPlayer.this,"Finding a Game...",
"Searching for opponent, please wait...", false, false);
}
@Override
protected Void doInBackground(Void... params) {
synchronized (this) {
try {
model.beginMatchMaking();
model.setWordsList();
// Get the opponent's animal from the model
oppAnimal = reverseDrawable(model.getOpponentAnimal());
// Display the multiplayer screen
} catch (InternetConnectionException e) {
e.fillInStackTrace();
quitFlag = true;
error(States.error.CONNECTION);
return null;
} catch (EmptyQueueException e) {
e.fillInStackTrace();
quitFlag = true;
error(States.error.NOOPPONENT);
return null;
} catch (InternalErrorException e) {
e.fillInStackTrace();
quitFlag = true;
error(States.error.INTERNAL);
return null;
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (!quitFlag) {
progressDialog.dismiss();
gameTimer = new GameTimer(START_TIME, INTERVAL);
gameTimer.start();
}
}
}
调用线程后,它会在initialDisplay上发生段错误,因为模型类中的字段根本没有更新。它就好像刚刚创建它并没有做任何事情
答案 0 :(得分:0)
我不确定AsyncTask类 但如果它是正确配置的线程和下一行
new LoadTask().execute();
将正确启动此线程,在这种情况下,线程将在并行执行但通常在行之后执行:
setContentView(R.layout.activity_multi_player);
initialDisplay(animal, background, oppAnimal);
证明你可以打印消息的主要方法。 要解决这个问题,您可以在启动线程后添加下一行:
new LoadTask().execute();
Thread.sleep(100)