1

Google Play サービスの AppStateClient に問題があります。以下のコードを 1 つのデバイスのみで実行すると、期待どおり onStateLoaded に入りますが、別のデバイスが関係している場合は、データに競合がなくても常に競合が発生します。

    @Override
    public void onSignInSucceeded() {
        Log.i("", "StatCount" + playHelper.getAppStateClient().getMaxNumKeys());
        playHelper.getAppStateClient().updateState(0, "test".getBytes());
        playHelper.getAppStateClient().loadState(new OnStateLoadedListener() {
            @Override
            public void onStateLoaded(int i, int i2, byte[] bytes) {
                Log.i("AppStateTest","load {" +  new String(bytes) +"}");
            }

            @Override
            public void onStateConflict(int i, String s, byte[] bytes, byte[] bytes2) {
                Log.i("AppStateTest","conflict " + new String(bytes) +" <> " + new String(bytes2));
            }
        },0);
    }

出力:

I/AppStateTest( 4173): conflict test <> test
4

1 に答える 1

1

これは意図したとおりに機能しています。競合は、データが異なるという意味ではありません。競合を判断する際に、データ自体は考慮されません。競合と判断されるのは、このデバイスが最後にデータを読み取った後に別のデバイスがデータに書き込んだことです。このことを考慮:

  1. デバイス A は「Foo」と読みます
  2. デバイス B は「Foo」と読みます
  3. デバイス A は「Foo」と書き込みます
  4. デバイス B は「Foo」と書き込みます

この場合、データが同じであっても、デバイス B で競合が発生します (これは、手順 4 の後でいつでもデータをロードするときに通知されます)。データが異なるためではなく、データが最後に読み取られた後に別のソースからの書き込みが発生したためです。

アプリのロジックの観点から、これが競合と見なされない場合は、resolveConflict を呼び出して解決してください。

于 2013-07-10T00:16:47.547 に答える