Подтвердить что ты не робот

Матчи Turnbased исчезают после загрузки в первый раз

Я разрабатываю игру для Android с помощью Служб Google Play для создания взаимного соответствия.

Сначала все было нормально. Я загружаю разворотные соответствия для подписанного пользователя с помощью

Games.TurnBasedMultiplayer.loadMatchesByStatus(getApiClient(),
        new int[]{TurnBasedMatch.MATCH_TURN_STATUS_MY_TURN,
                TurnBasedMatch.MATCH_TURN_STATUS_THEIR_TURN,
                TurnBasedMatch.MATCH_TURN_STATUS_INVITED,
                TurnBasedMatch.MATCH_TURN_STATUS_COMPLETE})
        .setResultCallback(this);

Он всегда загружает все совпадения, которые являются любыми из заданных состояний. Но с прошлых выходных вызывается callback, но совпадений нет, так как я не участвую ни в одном матче (ответ "Состояние" в порядке). Я удалил кеш из Google Play Services на свой телефон и перезагрузил устройство. В этот момент все матчи были показаны снова до следующего раза, когда я открыл приложение. Снова все матчи отсутствовали. Как только я начинаю новый матч, матч продолжает демонстрироваться с помощью вышеописанного метода (обновление списка), пока я не закрою приложение. На следующем запуске этот матч также исчез.

Я должен сказать, что игра еще не опубликована, но на этапе тестирования в консоли разработчика Google Play. Я нашел ту же проблему на эмуляторе. Он работал отлично в течение нескольких дней, но внезапно возникла та же проблема, что и у моего реального устройства (с более поздней сборкой, поэтому это не означает, что это приводит к одному изменению кода).

Кто-нибудь еще заметил это поведение или имеет представление о том, как его разрешить?

Возможно, это связано с тем, что к одной игре подключено несколько приложений? У меня было два приложения, подписанные с сертификатами отладки, и сегодня днем ​​добавили один для подписанного apk. Когда я использовал подписанный apk, он работал снова, пока я не развернул новое тестовое приложение (отладочная подпись). После переключения обратно на подписанный apk ошибка все еще вокруг.

Как никто, кажется, не знает ответа, позвольте мне перефразировать вопрос. Должен ли я сам кэшировать TurnBasedMatches на устройстве? Я снова удалил кеш игровых сервисов и снова открыл приложение. Результат? Список сотен игр (так как я должен каждый раз запускать новую игру во время тестирования...)

Мой код для обработки loadMatchesResult

@Override
public void onResult(TurnBasedMultiplayer.LoadMatchesResult loadMatchesResult)
{
    showToast("GotMatches status: " + loadMatchesResult.getStatus().getStatusCode());

    //add matches to listview (only caching matchId, no references to turnbasedmatch)

    loadMatchesResult.getMatches().getMyTurnMatches().close();
    loadMatchesResult.getMatches().getInvitations().close();
    loadMatchesResult.getMatches().getTheirTurnMatches().close();
    loadMatchesResult.getMatches().getCompletedMatches().close();
    loadMatchesResult.release();

}

Нашел еще один интересный момент.. он начинает выглядеть, как проблема возникает при развертывании нового apk на устройстве... После развертывания нового apk (либо путем установки альфа-версии из игры Google, либо непосредственно отлаживаемой версии из Android Studio ) матчи ушли. Когда я не изменю apk, я могу перезагрузить свой телефон/закрыть приложение, и он отлично работает...

Проблема также возникает, если я обновляю приложение через магазин воспроизведения... Там должно быть больше людей, имеющих эту проблему!

4b9b3361

Ответ 1

Извлечен из https://developer.android.com/reference/com/google/android/gms/common/api/PendingResult.html#setResultCallback(com.google.android.gms.common.api.ResultCallback)

После того, как результат был получен с помощью await() или доставлен в обратный вызов результата, это ошибка, чтобы попытаться снова получить результат. Ответчик или речевой вызов отвечает за освобождение любых ресурсов, связанных с возвращенным результатом. Некоторые типы результатов могут реализовать Releaseasable, и в этом случае release() следует использовать для освобождения связанных ресурсов.

После получения результата возникает ошибка при попытке получить результаты снова, пока вы не освободите ресурсы, связанные с возвращенным результатом, поэтому очистка кеша работает, чтобы сделать их видимыми снова. Вам нужно либо получить доступ к кешу устройства, либо отобразить результаты там, либо очистить связанные ресурсы (внутри программы), когда вы хотите снова получить результаты.

Ответ 2

У меня была такая же проблема, пока я не нашел "Сохраненные игры" в моей консоли разработчика:

  • Перейдите в раздел Игровые службы → Сведения о игре → Сохраненные игры
  • Задайте элемент "On"

Saved Games item in the Developer Console

Это должно решить вашу проблему,

веселит, Пол