0

こんにちは、別のスレッドで対戦相手を見つけるマルチプレイヤー ゲームを作成しようとしていますが、スレッドで実行されているコードがメイン クラスのモデルを更新しない理由がわかりません...

これがメインクラスのコードです。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 で segfault が発生します。作成されたばかりで何も行われていないかのように動作します

4

1 に答える 1

0

AsyncTask クラスについてはよくわかりませんが、適切に構成されていれば Thread と次の行

new LoadTask().execute();

このスレッドを適切に開始します。この場合、スレッドは並行して実行されますが、通常は次の行の後に実行されます。

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

それを証明するために、メッセージのメインメソッドを出力できます。それを解決するには、スレッドを開始した後に次の行を追加するだけです:

new LoadTask().execute();
Thread.sleep(100)
于 2013-05-21T20:25:51.007 に答える