Проблема с сервисом исполнителя в приложении Eclipse для Android
В основном, я разрабатываю живые обои OpenGL для телефонов Android. Это мой класс обслуживания обоев.
public class Wallpaper extends GLWallpaperService {
private class MyEngine extends Engine {
private GLRenderer glRenderer;
private GL10 gl;
private EGL10 egl;
private EGLContext glc;
private EGLDisplay glDisplay;
private EGLSurface glSurface;
private ExecutorService executor;
private Runnable drawCommand;
public void onCreate(final SurfaceHolder holder) {
super.onCreate(holder);
executor = Executors.newScheduledThreadPool(BIND_AUTO_CREATE);
drawCommand = new Runnable() {
public void run() {
glRenderer.onDrawFrame(gl);
egl.eglSwapBuffers(glDisplay, glSurface);
if (isVisible()
&& egl.eglGetError() != EGL11.EGL_CONTEXT_LOST) {
executor.execute(drawCommand);
}
}
};
}
public void onSurfaceCreated(final SurfaceHolder holder) {
super.onSurfaceCreated(holder);
Runnable surfaceCreatedCommand = new Runnable() {
public void run() {
// Initialize OpenGL
egl = (EGL10) EGLContext.getEGL();
glDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
egl.eglInitialize(glDisplay, version);
int[] configSpec = { EGL10.EGL_RED_SIZE, 5,
EGL10.EGL_GREEN_SIZE, 6, EGL10.EGL_BLUE_SIZE, 5,
EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE };
EGLConfig[] configs = new EGLConfig[1];
int[] numConfig = new int[1];
egl.eglChooseConfig(glDisplay, configSpec, configs, 1,
numConfig);
EGLConfig config = configs[0];
glc = egl.eglCreateContext(glDisplay, config,
EGL10.EGL_NO_CONTEXT, null);
glSurface = egl.eglCreateWindowSurface(glDisplay, config,
holder, null);
egl.eglMakeCurrent(glDisplay, glSurface, glSurface, glc);
gl = (GL10) (glc.getGL());
// Initialize Renderer
glRenderer = new GLRenderer(Wallpaper.this);
glRenderer.onSurfaceCreated(gl, config);
}
};
executor.execute(surfaceCreatedCommand);
}
public void onSurfaceDestroyed(final SurfaceHolder holder) {
Runnable surfaceDestroyedCommand = new Runnable() {
public void run() {
// Free OpenGL resources
egl.eglMakeCurrent(glDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
egl.eglDestroySurface(glDisplay, glSurface);
egl.eglDestroyContext(glDisplay, glc);
egl.eglTerminate(glDisplay);
}
};
executor.execute(surfaceDestroyedCommand);
super.onSurfaceDestroyed(holder);
}
public void onSurfaceChanged(final SurfaceHolder holder,
final int format, final int width, final int height) {
super.onSurfaceChanged(holder, format, width, height);
Runnable surfaceChangedCommand = new Runnable() {
public void run() {
glRenderer.onSurfaceChanged(gl, width, height);
}
};
executor.execute(surfaceChangedCommand);
}
public void onDestroy() {
executor.shutdownNow();
super.onDestroy();
}
public void onVisibilityChanged(final boolean visible) {
super.onVisibilityChanged(visible);
if (visible) {
executor.execute(drawCommand);
}
}
public void onOffsetsChanged(final float xOffset, final float yOffset,
final float xOffsetStep, final float yOffsetStep,
final int xPixelOffset, final int yPixelOffset) {
super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep,
xPixelOffset, yPixelOffset);
Runnable offsetsChangedCommand = new Runnable() {
public void run() {
if (1 / xOffsetStep + 1 != 0f) {
glRenderer.setParallax(xOffset - 1f);
}
}
};
executor.execute(offsetsChangedCommand);
}
}
public Engine onCreateEngine() {
return new MyEngine();
}
}
Он отлично работает на моем телефоне (Samsung Galaxy S2) и некоторых других, но были сообщения о том, что он не загружается. Живые обои не могут быть просмотрены вообще, даже с модели Galaxy S1! Так как это работает на моем телефоне, я не могу понять, что с ним не так. У меня нет телефонов, которые не могут запустить программу, поэтому я не могу решить проблему.
спасибо за ответ. но я использую OpenGL ES 1.0, как вы можете видеть с EGL10... импортированным GL10. ооо, но я видел, что я импортировал GL11 (OpenGL 1.1), что могло вызвать проблему, я полагаю?
2 ответа
Попробуйте удалить executor.shutdownNow();
от onDestroy()
, Некоторые телефоны Samsung имеют тенденцию звонить onDestroy
слишком рано, что приведет к закрытию потока.
OpenGL ES 2.0 поддерживается Android 2.2 и более поздними версиями.
Samsung Galaxy S1 и многие другие доступные в настоящее время телефоны работают до версии 2.2.
Я предлагаю вам дважды проверить свои уровни API и рассмотреть возможность отката к OpenGL ES 1.0 или написания оболочки, чтобы использовать ее для разных уровней API.