从GLRendering线程中删除布局中的视图

时间:2014-07-30 00:08:33

标签: android opengl-es splash-screen runnable ui-thread

摘要

我试图从我的GL渲染线程中可靠地从我的布局中删除视图。

详情

我的启动画面已添加到我的主要布局中,所以我的观点按此顺序排列:

  • GLSurfaceView
  • Splashscreen(这是一个简单的Android视图)

我的所有对象和可以在后台加载的任何内容都是从AsyncTask加载的,然后,我的GL纹理加载到GL线程上(根据需要),然后我从布局中删除Splashscreen显示我应用的主菜单屏幕。

90%的时间它完美运行,(我的设备上的加载时间约为3.5秒),但是,偶尔,它似乎永远不会删除视图,或者最多可能需要8秒。

这是我目前的实施

在我的活动类中,我有以下方法设置

public void dismissSplashScreen(){

        removeSplash = new Runnable(){

        public void run(){

            //Is splashscreen currently visible?
            if (splash.isShown()){

                //Remove the splashscreen
                layout.removeView(splash);

                //Recycle splash screen as it's no longer required
                recycle();                  
            }

        }
    };

        //Remove it
        handler.post(removeSplash);

}

然后在我的GLRenderer的 onSurfaceCreated 方法中,我有这个:

public void onSurfaceChanged(GL10 gl, int deviceWidth, int deviceHeight) {

    GLES20.glViewport(offsetX, offsetY, width, height);

    Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

    loadGLTextures();

    //Everything is done! Dismiss the splash to reveal main menu
    activity.dismissSplashScreen();

}

我也试图使用runOnUIThread,但结果是相同的,如果不是更糟。我的实施在这里是否正确?我可以检查哪些内容,一旦完成所有内容,是否有更简单的方法从布局中删除此视图? (我不能直接从活动类中删除它,因为我必须等待GL纹理加载到GL线程上。)

1 个答案:

答案 0 :(得分:0)

排序。

原因是因为我从 onSurfaceChanged 调用 activity.dismissSplashScreen ,并且多次调用onSurfaceChanged(我收集的一个常见问题,以及我所遇到的问题)还没到达底部。)

所以我认为发生的事情是,它是将我的runnable发布到队列中,然后在第一个开始或完成之前发布另一个,有时是第三次。

所以一切都变得有些混乱。

我只是添加了一个布尔标志来保证runnable只发布一次:

if (!splashIsGone){
        activity.dismissSplash();
        splashIsGone = true;
    }