如何在线程中更新主类中的内容

时间:2013-05-21 20:09:40

标签: java android url

您好我正在尝试制作一个多人游戏,它会在另一个线程中找到对手,但我不确定为什么线程中运行的代码不会更新主类中的模型......

这是主类中的代码。对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上发生段错误,因为模型类中的字段根本没有更新。它就好像刚刚创建它并没有做任何事情

1 个答案:

答案 0 :(得分:0)

我不确定AsyncTask类 但如果它是正确配置的线程和下一行

new LoadTask().execute();

将正确启动此线程,在这种情况下,线程将在并行执行但通常在行之后执行:

setContentView(R.layout.activity_multi_player);
initialDisplay(animal, background, oppAnimal);

证明你可以打印消息的主要方法。 要解决这个问题,您可以在启动线程后添加下一行:

new LoadTask().execute();
Thread.sleep(100)