When you change the device orientation, you app is closed and then
reopened.
Android handles bitmaps a "special" way, you HAVE to explicitly
recycle them as soon as you don't need them anymore... or they stay
allocated in memory and NEVER get freed.
I have started to code an app which uses a set of ImageViews. To avoid
allocation errors on orientation changes, I had to override the
onDestroy() method this way :
/*
* (non-Javadoc)
*
* @see android.app.Activity#onDestroy()
*/
@Override
protected void onDestroy() {
super.onDestroy();
if (isFinishing()) {
for (ImageView view : mImgViews) {
Drawable toRecycle = view.getDrawable
();
if (toRecycle != null) {
((BitmapDrawable)
toRecycle).getBitmap().recycle();
}
}
}
}
After this, If the orientation change time is too long, you have to
store the data (bitmaps and whatever else you need) with
onRetainNonConfigurationInstance() and get them back on reinit with
getLastNonConfigurationInstance().
This has been explained by Romain Guy on his blog :
http://www.curious-creature.org/2009/02/16/faster-screen-orientation-change-with-android/
On 17 août, 15:58, Flying Coder <[email protected]> wrote:
> This has been driving me nuts and I'm hoping someone will be able to
> help me understand what is happening (or better yet, how to fix
> it! ;-).
>
> I set the background image in one of my apps to the system wallpaper
> image using the following code:
>
> Drawable wp = this.getWallpaper();
> background = (ImageView) findViewById(R.id.background);
> background.setImageDrawable(wp);
>
> This seems to work fine, but periodically, I get the out of memory
> error shown below. Actually, on the emulator, all I have to do is
> repeatedly rotate the device and this error will consistently happen
> after 10-12 rotations. On the G1, opening and closing the keyboard
> doesn't seem to cause this, but I'll still get the failure every once
> in a while.
>
> Is getWallpaper() actually making a copy of the image (I would have
> thought I'd just get a refernece to the existing bitmap)? Do I need
> to do anything special to free the image?
>
> 08-17 08:32:37.943: ERROR/dalvikvm-heap(1597): 614400-byte external
> allocation too large for this process.
> 08-17 08:32:37.943: ERROR/(1597): VM won't let us allocate 614400
> bytes
> 08-17 08:32:38.054: DEBUG/AndroidRuntime(1597): Shutting down VM
> 08-17 08:32:38.054: WARN/dalvikvm(1597): threadid=3: thread exiting
> with uncaught exception (group=0x4000fe70)
> 08-17 08:32:38.054: ERROR/AndroidRuntime(1597): Uncaught handler:
> thread main exiting due to uncaught exception
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597):
> java.lang.OutOfMemoryError: bitmap size exceeds VM budget
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.graphics.BitmapFactory.nativeDecodeFileDescriptor(Native
> Method)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:
> 424)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ApplicationContext.getCurrentWallpaperLocked
> (ApplicationContext.java:523)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ApplicationContext.peekWallpaper(ApplicationContext.java:
> 515)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ApplicationContext.getWallpaper(ApplicationContext.java:
> 504)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.content.ContextWrapper.getWallpaper(ContextWrapper.java:201)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at ....onCreate
> (MyApp.java:247)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:
> 1123)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
> 2231)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:
> 2284)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ActivityThread.access$1800(ActivityThread.java:112)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.os.Handler.dispatchMessage(Handler.java:99)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.os.Looper.loop(Looper.java:123)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> android.app.ActivityThread.main(ActivityThread.java:3948)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> java.lang.reflect.Method.invokeNative(Native Method)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> java.lang.reflect.Method.invoke(Method.java:521)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
> (ZygoteInit.java:782)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
> 08-17 08:32:38.313: ERROR/AndroidRuntime(1597): at
> dalvik.system.NativeStart.main(Native Method)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---