通过待处理结果加载Google Play服务成就

时间:2014-06-06 15:27:55

标签: android google-play-services achievements

我在这里做的是加载所有成就并将它们保存到本地地图:

这是我的代码

public LinkedHashMap<String,Boolean> getAchievements(){
    final LinkedHashMap<String,Boolean> achievementMap = new LinkedHashMap<String, Boolean>();
    PendingResult<Achievements.LoadAchievementsResult> achievementsResult = Games.Achievements.load(gameHelper.getApiClient(), false);
    achievementsResult.setResultCallback(new ResultCallback<Achievements.LoadAchievementsResult>() {
        @Override
        public void onResult(Achievements.LoadAchievementsResult loadAchievementsResult) {
            if(loadAchievementsResult != null) {
                if (loadAchievementsResult.getStatus().getStatusCode() == GamesStatusCodes.STATUS_OK) {
                    if (loadAchievementsResult.getAchievements() != null) {
                        AchievementBuffer achievementBuffer = loadAchievementsResult.getAchievements();
                        for(Achievement achievement : achievementBuffer){
                            achievementMap.put(achievement.getName(),achievement.getState() == Achievement.STATE_UNLOCKED);
                        }
                        achievementBuffer.close();
                    }
                }
            }

        }
    });
    return achievementMap;
}

一切都运行正常,即使我非常确定它不能使用返回的HashMap空白。据我所知,我只是创建一个空的hashmap,设置一个“监听器”并返回空的hashmap。我认为在将来的某个时候数据准备就绪时会调用回调,但是由于它现在正在工作,我在从这个方法返回之前在hashmap中有数据,即使我不等它或任何东西。不要误会我的意思,我很高兴它的工作很简单,但我想我不能确定当我返回时数据已经写入了hasmap,因此可能会遇到网络连接较慢的问题。

我是对的,任何人都可以告诉我,为什么在我从这个方法返回之前调用回调?

这可能是这种情况,因为数据以某种方式被缓冲,并且android在设置结果回调时会立即调用回调吗?

1 个答案:

答案 0 :(得分:1)

您在Games.Achievements.load()请求中将forceReload设置为false,因此它将在大多数时间使用数据缓存。我不确定该方法是否会立即在同一个线程上运行回调,但听起来就像是。

如果您不喜欢它的工作方式,您可以在自己的单独线程上运行getAchievemnts(),然后使用await()绕过回调。

Achievements.LoadAchievementsResult result = load.await();