0

アプリケーション オブジェクトに問題があります。現在、サービスを使用して、電子ゲーム ボードからの受信データをシミュレートしています。このデータは、2D ブール配列として表されます。Service は 5 秒ごとに Application Object のメソッドを使用して配列を更新します (setDetectionMap())。この配列は、別のメソッド (getDetectionMap()) を使用してメイン アクティビティのスレッドによって読み取られています。いくつかのデバッグの後、メインのアクティビティに変更が見られないことはほぼ確実です。私のアプリケーションオブジェクトのコードは次のとおりです。

 public class ChessApplication extends Application{

    private static ChessApplication singleton;
    private boolean[][] detectionMap;

    public static ChessApplication getInstance(){
        return singleton;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        singleton=this;
        detectionMap=new boolean[8][8];
    }

    public boolean[][] getDetectionMap(){
        return detectionMap;
    }
    public void setDetectionMap(boolean[][] newMap){
        detectionMap=newMap;
        Log.d("Chess Application","Board Changed");
    }
}

マニフェストをチェックし、オブジェクト宣言を何十回も書き直しました。LogCat タグを追加して、コードが実行されるべきときに実行されていることを確認し、冗長と思われるシングルトン コードを実装しました。 . これを引き起こしている可能性のあるアイデアはありますか?ちなみに、アクティビティの実行中に変数の状態を表示する方法を誰か教えてもらえますか? 前もって感謝します。

4

1 に答える 1

0

アクティビティがgetDetectionMap()を呼び出して、更新が発生した後に新しいマップを取得していますか?

それ以外の場合は、古いboolean [] []配列への参照を保持しているため、setDetectionMap(...)は実際には現在のデータ構造を更新せず、「detectionMap」変数を更新して別のデータ構造を指すようにします。そのため、メインアクティビティは、次にgetDetectionMapを呼び出すまでスワップアウトを認識しません。

簡単な修正:setDetectionMapで、値をnewMapからdetectionMapに手動でコピーします。または、アクティビティの参照を更新して、適切なマップが表示されるようにします。

元の質問とはまったく関係のないもう1つの観察結果:Android開発中にアプリケーションをオーバーライドすることは非常に珍しく、本当に正当な理由がない限り、通常は「コードの臭い」と見なされます。この場合、サービスとアクティビティの間でコミュニケーションをとることができるようにするためだと思いますが、完全に必要というわけではない仲介者を作成します。 これは、2つの間で直接通信する方法に関する便利なSOスレッドです:)

于 2012-05-03T23:49:16.537 に答える