摘要
我试图从我的GL渲染线程中可靠地从我的布局中删除视图。
详情
我的启动画面已添加到我的主要布局中,所以我的观点按此顺序排列:
我的所有对象和可以在后台加载的任何内容都是从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线程上。)
答案 0 :(得分:0)
排序。
原因是因为我从 onSurfaceChanged 调用 activity.dismissSplashScreen ,并且多次调用onSurfaceChanged(我收集的一个常见问题,以及我所遇到的问题)还没到达底部。)
所以我认为发生的事情是,它是将我的runnable发布到队列中,然后在第一个开始或完成之前发布另一个,有时是第三次。
所以一切都变得有些混乱。
我只是添加了一个布尔标志来保证runnable只发布一次:
if (!splashIsGone){
activity.dismissSplash();
splashIsGone = true;
}