0

Android で bluetooth tic tac toe アプリケーションを作成しました。私はアンドロイドに詳しくないので、ネットでソースコードを読んで勉強しました。今のところ、それがどのように機能するかは次のようになります。

  • アクティビティ 1 > 新しいゲーム、概要、終了を表示します。ここには何もない
  • アクティビティ 2 > ボタン付きのリストビューで、デバイスを検出可能にして検索します。ユーザーが検出されたデバイスに触れると、接続が確立されます。プレイヤー名を交換するための別のボタンと、次のアクティビティに進むための別のボタンが利用可能です
  • アクティビティ 3 > どちらのプレーヤーが最初に行くかを決めます。じゃんけんに対応する 3 つのボタン、情報を交換するための別のボタン、次のアクティビティに進むためのボタン
  • アクティビティ 4 > 実際のゲーム。いくつかのロジック (通常の tic tac toe ではありません) がありますが、基本的にはユーザーが触れると、計算を行い、整数を送信し、返されるデータを待ちます。

通信を実装するために、接続をリッスンする serverThread、デバイスに接続する connectThread、データを送受信する commsThread の 3 つのスレッドがあります。接続が確立された後は、commsThread だけが必要です。今、これは私が明確さを失うところです。Game クラスに commsThread タイプのオブジェクトがあり、接続が確立されたらアクティビティ 2 で commsThreadObject.start() を呼び出し、アプリケーションが終了するまでこのスレッドを実行し続けます。各アクティビティで、そのアクティビティに属するハンドルを commsThread に渡します。

これでコードは機能しますが、きちんとした感じがしません (実際、非常に汚いコードのように感じます)。ハンドラーから UI を更新する以外には静的オブジェクトが必要なので、多くのものを静的に変換することになりました。また、このようにスレッドを実行し続けるとメモリリークが発生する可能性があることも理解しています。今、私はサービスについて学んでいます。それがこれを行う正しい方法であるかどうかを知りたいだけですか?

また、以前の実験では、単一のアクティビティがあり、ボタンのクリックでレイアウトを切り替えただけでした。それは良いアプローチですか?

これは、Game クラスのハンドラーのコードです。

static Handler receiveCell = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        int numOfBytesReceived = msg.arg1;
        byte[] buffer = (byte[]) msg.obj;
        String strReceived = new String(buffer);
        strReceived = strReceived.substring(0, numOfBytesReceived);
            gameInstance.changeSymbol();
            int x = Integer.parseInt(strReceived);
            int cur = gameInstance.curCell;
            boardGroup[cur].put(x % 3, x / 3, gameInstance.current);
            gameInstance.state = boardGroup[cur].checkLines();
            gameInstance.checkState(cur % 3, cur / 3);
            gameInstance.changeSymbol();
            gameInstance.curCell = x;
            if (boardGroup[x].emptyBlock() == 0) {
                numPad.enableInput();
            } else {
                boardGroup[x].enableInput();
            }
            currentTurn.setText(playerName);
        }
    };

ご覧のとおり、私のハンドラーにはかなりの量があります。ここで参照されているすべての変数を静的にする必要がありました。代わりに、これをハンドラーの外に移動できます。メッセージがいつ受信されたかを知る方法はありますか?ローカルのようなものstrReceived.wait()strReceived.notify()

4

1 に答える 1

0

画面が論理的に異なる場合 (スプラッシュ/設定/メイン/概要など)、それらを異なるアクティビティにすることは理にかなっています。これにより、アプリがより複雑になっても、あまりにも多くのことを行うモンスター クラスを取得することはありません。 .

スレッドとサービスについては、スレッドを適切に管理する場合 (onPause() でソケットを切断してスレッドを強制終了し、onResume() に戻すなど)、アプローチに問題はありません。ただし、バックグラウンドでデータを受信したい場合、またはその他の理由でライフサイクルがより複雑な場合は、サービスが必要です。

于 2013-08-08T16:30:14.867 に答える