еще раз мне нужна помощь:
вчера я задал этот вопрос о том, как использовать большое jpg-изображение в качестве растрового изображения (http://stackoverflow.com/questions/13511657/problems-with-big-drawable-jpg-image), и я решил сам (это мой собственный ответ на этот вопрос), но всякий раз, когда я возобновляю свою деятельность, поскольку она использует это растровое изображение в качестве текстуры GLRenderer, происходит сбой. Я пробовал много вещей, последняя попытка состояла в том, чтобы сделать это растровое изображение статическим, чтобы сохранить его как переменную-член в действии, но оно дает сбой, потому что, я полагаю, теряет mBuffer.
Подробнее о коде активности:
Я объявил его как SingletonInstance в манифесте:
android:launchMode="singleInstance"
чтобы сохранить тайлы для рендерера.
и вот немного кода:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLSurfaceView = new GLSurfaceView(this);
mGLSurfaceView.setEGLConfigChooser(true);
mSimpleRenderer = new GLRenderer(this);
getTextures();
if (!mIsTileMapInitialized){
tileMap = new LandSquareGrid(1, 1, mHeightmap, mLightmap, false, true, true, 128, true);
tileMap.setupSkybox(mSkyboxBitmap, true);
mIsTileMapInitialized = true;
}
initializeRenderer();
mGLSurfaceView.setRenderer(mSimpleRenderer);
setContentView( R.layout.game_layout );
setOnTouchListener();
initializeGestureDetector();
myCompassView = (MyCompassView)findViewById(R.id.mycompassview);
// Once set the content view we can set the TextViews:
coordinatesText = (TextView) findViewById(R.id.coordDynamicText);
altitudeText = (TextView) findViewById(R.id.altDynamicText);
directionText = (TextView) findViewById(R.id.dirDynamicText);
//if (!mIsGLInitialized){
mOpenGLLayout = (LinearLayout)findViewById(R.id.openGLLayout);
mOpenGLLayout.addView(mGLSurfaceView);
mVirtual3DMap = new Virtual3DMap(mSimpleRenderer, tileMap);
if (mGameThread == null){
mGameThread = new Thread(mVirtual3DMap);
mGameThread.start();
}
}
В методе getTextures я получаю несколько маленьких текстур и самую большую, как в моем ответе на последний вопрос:
if (mTerrainBitmap==null){
InputStream is = getResources().openRawResource(R.drawable.terrain);
try {
// Set terrain bitmap options to 16-bit, 565 format.
terrainBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap auxBitmap = BitmapFactory.decodeStream(is, null, terrainBitmapOptions);
mTerrainBitmap = Bitmap.createBitmap(auxBitmap);
}
catch (Exception e){
}
finally {
try {
is.close();
}
catch (IOException e) {
// Ignore.
}
}
}
Итак, опять же, в первый раз все работает отлично, но когда я возвращаюсь, я делаю:
protected void onPause() {
super.onPause();
mGLSurfaceView.onPause();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if (mVirtual3DMap != null) {
try {
mVirtual3DMap.cancel();
mGameThread=null;
mVirtual3DMap = null;
mGLSurfaceView.destroyDrawingCache();
mSimpleRenderer=null;
System.gc();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
И когда я возобновляю деятельность:
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
if (mVirtual3DMap != null) {
try {
mVirtual3DMap.resume();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
И он терпит крах.
Почему?? Хорошо, вот причина исключения в GLThread:
java.lang.IllegalArgumentException: растровое изображение переработано...
Я пробовал эту грязную вещь, потому что запуская более чем в два раза исходную активность, приложение вылетает из-за этого или из-за объема используемой памяти, и теперь я не знаю, отменить ли все эти изменения или что с этим делать.
Есть ли хороший способ сохранить в памяти и использовать это растровое изображение в той или иной активности приложения?
Пожалуйста, мне нужны ваши советы.
Заранее спасибо.