Android 从排行榜返回时,主活动暂停几秒钟(由于重新加载纹理)

Android 从排行榜返回时,主活动暂停几秒钟(由于重新加载纹理),android,android-activity,google-play-services,google-play-games,leaderboard,Android,Android Activity,Google Play Services,Google Play Games,Leaderboard,我的应用程序只有一个活动 当我启动我的Google Play排行榜(这是一个单独的活动),然后返回到我的应用程序的主要活动时,整个过程暂停(有时长达4或5秒),然后恢复正常服务 在过去的5个小时里,我到处寻找,但我就是不明白为什么会发生这种情况 在我的应用程序的活动中,我使用一个自定义的场景管理器,这样使用可以从一个“场景”导航到下一个(有点“模拟”单独的活动)。当从我的任何其他场景返回到我的主菜单时,一切都是即时的。我只有在从外部活动(我的play services排行榜)返回时才会遇到此问题

我的应用程序只有一个活动

当我启动我的Google Play排行榜(这是一个单独的活动),然后返回到我的应用程序的主要活动时,整个过程暂停(有时长达4或5秒),然后恢复正常服务

在过去的5个小时里,我到处寻找,但我就是不明白为什么会发生这种情况

在我的应用程序的活动中,我使用一个自定义的场景管理器,这样使用可以从一个“场景”导航到下一个(有点“模拟”单独的活动)。当从我的任何其他场景返回到我的主菜单时,一切都是即时的。我只有在从外部活动(我的play services排行榜)返回时才会遇到此问题

以下是我的排行榜代码:

如果有人能提供任何建议,我将不胜感激

if (scoresButtonPresses){

    displayLeaderBoard(); 

}

void displayLeaderBoard(){

    //Display the leaderboard if already signed in
    if (checkSignedIn()){               

        startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), leaderboardID), 1);

    }

    //if not already connected, then set flag and connect to play services before displaying leaderbaord
    else{
        signInAction=SHOW_LEADERBOARD;                      
        getGameHelper().beginUserInitiatedSignIn();
    }   


}

@Override
public void onSignInSucceeded() {

    //If the flag is set, then display the leaderboard
    if (signInAction==DISPLAY_LEADERBOARD){
            startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), leaderboardID), 1);
    }

    //Otherwise, reset the flag and take no action
    else {signInAction=NO_ACTION;}
}
编辑

我想我已经解决了问题所在,但我需要知道如何阻止它发生

因此,在我的onSurfaceCreated()方法中,我加载了所有位图并将纹理设置为:

    atlas= BitmapFactory.decodeResource(view.getResources(), R.drawable.mainatlas, BMFOptions);
然后,我将其设置为纹理,如下所示(setTexture是我的自定义Quad类中的一个方法:

 sprite1.setTexture(view, atlas);
然后我回收图像,因为它不再需要

atlas1.recycle();
因此,当我从排行榜活动返回到主要游戏活动时,它调用onSurfaceCreated()同样,暂停是因为它正在重新加载所有图形/纹理。不幸的是,这是一个要求,因为这是一个openGL应用程序,建议在这里加载纹理,以防GL上下文丢失

我不确定的是,我的GL上下文真的丢失了吗?只需启动一个排行榜活动并立即返回到它的父活动?如果没有,我是否有办法检查它是否丢失,如果没有,然后跳过所有加载


我在某个地方读到,如果调用onSurfaceCreated,则意味着或者方向已更改(由于我的应用程序被锁定到横向),或者GLContext已丢失。这是否正确?如果是,在重新加载所有纹理时,我如何处理此暂停?!

启用GameHelper的调试日志:

getGameHelper().enableDebugLog(true);
这将为您提供更多关于谷歌服务正在做什么的信息,然后检查LogCat的时间间隔,它应该指示挂起的位置

从排行榜返回时调用的唯一方法应该是onResume()和onActivityResult()。将这些方法以及调试日志发布在此处可能会有所帮助

Zippy:Hi@BrianDeWolff,谢谢。我想我已经发现了问题所在,因为我怀疑这是一个排行榜活动与问题无关,请查看我问题中的编辑。这是因为纹理(重新)加载到我的onSurfaceChanged()中方法。如果您有任何建议,将不胜感激。谢谢!:-)


BrianDeWolff:这很有道理。我没有与德国劳埃德船级社合作的经验,但这似乎是一个非常常见的投诉/问题。例如:

检查活动的
onResume()
onActivityResult()
中的代码;当从排行榜返回到您的活动时,他们都会被呼叫。如果您使用的是
BaseGameActivity
,那么它也会调用
mHelper.onActivityResult()
,这可能会导致轻微延迟。您好@BrianDeWolff,谢谢。我想我已经发现了问题所在,因为我怀疑这是一个排行榜活动与问题无关,请参阅我问题中的编辑。这是因为在我的onSurfaceChanged()方法中(重新)加载了纹理。如果您有任何建议,我将不胜感激。谢谢!:-)这是有道理的。我没有与德国劳埃德船级社合作的经验,但这似乎是一个非常常见的投诉/问题。例如: