[android-developers] Re: out of memory error & getWallpaper
I'm seeing the same out of memory problem. It's consistent on my G1 in a few tries. Basically I used the built-in intent to get the photo on my sdcard, and set it as the app's background: Drawable d = Drawable.createFromPath(filename); mainBg.setBackgroundDrawable(d); The filename is what passed back from the photo picker in onActivityResult(). Doing this a few times will cause out of memory exception, reproducible 100% of the time. If the VM is to *eventually* free up the bitmap object memory, I suspect it's not doing its job well. I will give the recyle() a try now, and see if there's any improvement. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
Here's the crash log file in case you are interested: 08-20 10:08:00.700: INFO/ActivityManager(18682): Displayed activity com.android.camera/.ImageGallery2: 1137 ms 08-20 10:08:01.220: VERBOSE/ImageGallery2(20461): /ImageBlockManager.onPause 08-20 10:08:01.280: DEBUG/Main(20546): /sdcard/dcim/Camera/2009-07-27 19.18.31.jpg 08-20 10:08:01.300: ERROR/dalvikvm-heap(20546): 6291456-byte external allocation too large for this process. 08-20 10:08:01.300: ERROR/(20546): VM won't let us allocate 6291456 bytes 08-20 10:08:01.300: DEBUG/AndroidRuntime(20546): Shutting down VM 08-20 10:08:01.300: WARN/dalvikvm(20546): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) 08-20 10:08:01.300: ERROR/AndroidRuntime(20546): Uncaught handler: thread main exiting due to uncaught exception 08-20 10:08:01.310: ERROR/AndroidRuntime(20546): java.lang.OutOfMemoryError: bitmap size exceeds VM budget The picture is something I took with G1 camera, nothing special. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
@Nivek THANK YOU the recycle() call works GREAT! ((BitmapDrawable)d).getBitmap().recycle(); I went through 10~15 photos w/o crashing! --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
Well, even if we should "normally" not call the recycle method, I see in ApiDemos some calls to this method : LabelMaker.java - line 281 SpriteTextRenderer.java - line 122 TriangleRenderer.java - line 106 I tried to solve a problem of memory allocation when loading big files (4000x3000 pics) yesterday and again the manual call to recycle() is the only working solution I could find to be able to display these pics one after the other. Nivek On 20 août, 16:40, Hong wrote: > @Nivek > > THANK YOU the recycle() call works GREAT! > ((BitmapDrawable)d).getBitmap().recycle(); > > I went through 10~15 photos w/o crashing! --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
Hi Steve, PLease let me know how you fixed the belllow exeption run-time exception the next attempt to use recycled bitmap. I m also getting the same exeption trying to use a recycled bitmap android.graphics.bit...@43750030 Please reply back. Your reply will be highly appreciated. Thanks and regards Mohammed Sameer On Aug 18, 1:38 am, Flying Coder wrote: > Hi Nivek, > Unfortunately, doing recycle on the drawable returned by > ContextWrapper.getWallpaper() results in a run-time exception the next > time the app is launched: attempt touserecycledbitmap. Though > curiously, if I launch the app again after receiving the exeption, it > works fine. I.e., run time exception every other launch. > > At any rate, thanks for the pointer to Romain Guy's blog -- I > wasn't aware of the onRetainNonConfigurationInstance method. Should > be useful in some cases. > > Cheers, > Steve > > On Aug 17, 10:53 am, Nivek wrote: > > > > > 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-... > > > On 17 août, 15:58, Flying Coder 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 existingbitmap)? 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:bitmapsize 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.Con
[android-developers] Re: out of memory error & getWallpaper
Hi Nivek, Can you please tell me the solution for the problem attempt to use recycled bitmap Any solution please let me know. Your reply will be highly appreaciated Thanks and Regards Mohammed Sameer On Aug 17, 11:53 pm, Nivek wrote: > 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-... > > On 17 août, 15:58, Flying Coder 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 existingbitmap)? 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:bitmapsize 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: ERR
[android-developers] Re: out of memory error & getWallpaper
Hi, I am getting the following logs when i am changing the wallpaper for Homescreen. Even i am recycling the bitmap is done when the wallpaper changes in OnWallpaperChanged(). Still i m getting the bellow error. 03-26 05:02:16.829: INFO/AC(1340): setWallpaper(InputStream 03-26 05:02:16.840: INFO/AC(1340): setWallpaper(InputStream, FileOutputStream) 03-26 05:02:16.889: INFO/WallpaperService(1059): Wallpaper is changed!!! 03-26 05:02:16.899: INFO/WallpaperService(1059): beginBroadcast()2 03-26 05:02:16.899: INFO/ApplicationContext(1694): com.lge.homecube 03-26 05:02:16.899: INFO/ApplicationContext(1694): applicationContext is not null 03-26 05:02:16.899: INFO/ApplicationContext(1694): make mWallpaper null 03-26 05:02:16.909: INFO/WallpaperService(1059): onWallpaperChanged0 03-26 05:02:16.909: INFO/WallpaperService(1059): notifyCallbacks() 03-26 05:02:16.909: INFO/ApplicationContext(1059): android 03-26 05:02:16.909: INFO/ApplicationContext(1059): applicationContext is not null 03-26 05:02:16.909: INFO/ApplicationContext(1059): make mWallpaper null 03-26 05:02:16.909: INFO/WallpaperService(1059): onWallpaperChanged1 03-26 05:02:16.909: INFO/WallpaperService(1059): notifyCallbacks() 03-26 05:02:16.989: WARN/dalvikvm(1694): threadid=3: thread exiting with uncaught exception (group=0x40013e70) 03-26 05:02:16.989: ERROR/AndroidRuntime(1694): Uncaught handler: thread main exiting due to uncaught exception 03-26 05:02:17.019: WARN/LockPatternKeyguardView(1059): LockpatternKeyguardView WallpaperIntentReceiver_getWallpaper start 03-26 05:02:17.019: INFO/ApplicationContext(1059): getWallpaper() 03-26 05:02:17.029: INFO/ApplicationContext(1059): android 03-26 05:02:17.029: INFO/ApplicationContext(1059): GetCurrentWallaper 03-26 05:02:17.029: INFO/ApplicationContext(1059): Normal image wallpaper 03-26 05:02:17.029: INFO/WallpaperService(1059): List Of Callbacks 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.bit...@43895170 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.graphics.Canvas.throwIfRecycled(Canvas.java:942) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.graphics.Canvas.drawBitmap(Canvas.java:962) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at com.lge.homecube.Workspace.dispatchDraw(Workspace.java:596) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewGroup.drawChild(ViewGroup.java:1484) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at com.lge.homecube.DragLayer.dispatchDraw(DragLayer.java:280) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewGroup.drawChild(ViewGroup.java:1484) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.View.draw(View.java:5862) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.widget.FrameLayout.draw(FrameLayout.java:352) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.View.draw(View.java:5862) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.widget.FrameLayout.draw(FrameLayout.java:352) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw (PhoneWindow.java:1892) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewRoot.draw(ViewRoot.java:1239) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewRoot.performTraversals(ViewRoot.java:1049) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.view.ViewRoot.handleMessage(ViewRoot.java:1507) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.os.Handler.dispatchMessage(Handler.java:99) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.os.Looper.loop(Looper.java:123) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at android.app.ActivityThread.main(ActivityThread.java:3948) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at java.lang.reflect.Method.invokeNative(Native Method) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at java.lang.reflect.Method.invoke(Method.java:521) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:782) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 03-26 05:02:17.079: ERROR/AndroidRuntime(1694): at dalvik.system.NativeStart.main(Native Method) 03-26 05:02:17.269: INFO/ApplicationContext(1059): Read wallpaper file. 03-26 05:02:17.629: INFO/
[android-developers] Re: out of memory error & getWallpaper
I guess nobody reported my case. I've solved like below. See my case. ... Bitmap dummy = Bitmap.createBitma(1, 1, Config.RGB_565); Bitmap a = Bitmap.createBitma(100, 100, Config.RGB_565); Canvas c = new Canvas(a); ...c.draw(..) ... a.recycle(); c.setBitmap(dummy); // This is key point. Very important to remove reference of 'c'. a = null; c = null; . Good Luck. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
Are we not able to reassign Bitmaps? I get OOM just by doing something like Bitmap a; a = network.downloadimage(); a = network.downloadimage(); a = network.downloadimage();// <-- crash Do I have to : a.recycle() ; a= null; everytime? On Aug 25, 2:25 pm, freeanderson wrote: > I guess nobody reported my case. > I've solved like below. See my case. > > ... > > Bitmap dummy = Bitmap.createBitma(1, 1, Config.RGB_565); > > Bitmap a = Bitmap.createBitma(100, 100, Config.RGB_565); > Canvas c = new Canvas(a); > > ...c.draw(..) ... > > a.recycle(); > c.setBitmap(dummy); // This is key point. Very important to remove > reference of 'c'. > > a = null; > c = null; > > . > > Good Luck. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
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 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
[android-developers] Re: out of memory error & getWallpaper
Hi Nivek, Unfortunately, doing recycle on the drawable returned by ContextWrapper.getWallpaper() results in a run-time exception the next time the app is launched: attempt to use recycled bitmap. Though curiously, if I launch the app again after receiving the exeption, it works fine. I.e., run time exception every other launch. At any rate, thanks for the pointer to Romain Guy's blog -- I wasn't aware of the onRetainNonConfigurationInstance method. Should be useful in some cases. Cheers, Steve On Aug 17, 10:53 am, Nivek wrote: > 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-... > > On 17 août, 15:58, Flying Coder 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(Acti
[android-developers] Re: out of memory error & getWallpaper
The wallpaper is loaded into each application that requests it. It is only loaded the first time you ask for it, and the next time after it is changed to some other image. You are probably leaking memory. You can use the hat tool to look at your allocations -- search on this list, there have been a number of discussions about it. On Mon, Aug 17, 2009 at 9:38 AM, Flying Coder wrote: > > Hi Nivek, >Unfortunately, doing recycle on the drawable returned by > ContextWrapper.getWallpaper() results in a run-time exception the next > time the app is launched: attempt to use recycled bitmap. Though > curiously, if I launch the app again after receiving the exeption, it > works fine. I.e., run time exception every other launch. > >At any rate, thanks for the pointer to Romain Guy's blog -- I > wasn't aware of the onRetainNonConfigurationInstance method. Should > be useful in some cases. > > Cheers, > Steve > > > On Aug 17, 10:53 am, Nivek wrote: > > 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-... > > > > On 17 août, 15:58, Flying Coder 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
[android-developers] Re: out of memory error & getWallpaper
Dianne, I suspect you are right, though I'm having a heck of a time tracking it down (i.e., I don't see any leaks). Thanks for the info on the wallpaper! Cheers, Steve On Aug 17, 12:47 pm, Dianne Hackborn wrote: > The wallpaper is loaded into each application that requests it. It is only > loaded the first time you ask for it, and the next time after it is changed > to some other image. > > You are probably leaking memory. You can use the hat tool to look at your > allocations -- search on this list, there have been a number of discussions > about it. > > > > > > On Mon, Aug 17, 2009 at 9:38 AM, Flying Coder wrote: > > > Hi Nivek, > > Unfortunately, doing recycle on the drawable returned by > > ContextWrapper.getWallpaper() results in a run-time exception the next > > time the app is launched: attempt to use recycled bitmap. Though > > curiously, if I launch the app again after receiving the exeption, it > > works fine. I.e., run time exception every other launch. > > > At any rate, thanks for the pointer to Romain Guy's blog -- I > > wasn't aware of the onRetainNonConfigurationInstance method. Should > > be useful in some cases. > > > Cheers, > > Steve > > > On Aug 17, 10:53 am, Nivek wrote: > > > 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-... > > > > On 17 août, 15:58, Flying Coder 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.getCurrentWa
[android-developers] Re: out of memory error & getWallpaper
On Mon, Aug 17, 2009 at 7:53 AM, Nivek wrote: > > 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. That is not true. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
I'm sorry, I've certainly misunderstood something then, but... while coding an app dealing with bitmaps, this is what it looks like. Reading posts and blogs about memory management and use of bitmap led me to that conclusion, and carefully recycling bitmaps in my app allowed me to get rid of a lot of memory allocation exceptions. Anyway, about memory leaks on orientation changes, another blog post from Romain Guy could be useful: http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ You might try this Drawable.setCallback(null) trick... On 17 août, 22:02, Marco Nelissen wrote: > On Mon, Aug 17, 2009 at 7:53 AM, Nivek wrote: > > > 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. > > That is not true. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
Bitmap are eventually garbage collected. From the javadoc of the Bitmap class itself: "This is an advanced call, and normally need not be called, since the normal GC process will free up this memory when there are no more references to this bitmap." On Mon, Aug 17, 2009 at 3:14 PM, Nivek wrote: > > I'm sorry, I've certainly misunderstood something then, but... while > coding an app dealing with bitmaps, this is what it looks like. > Reading posts and blogs about memory management and use of bitmap led > me to that conclusion, and carefully recycling bitmaps in my app > allowed me to get rid of a lot of memory allocation exceptions. > > Anyway, about memory leaks on orientation changes, another blog post > from Romain Guy could be useful: > http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ > > You might try this Drawable.setCallback(null) trick... > > > On 17 août, 22:02, Marco Nelissen wrote: >> On Mon, Aug 17, 2009 at 7:53 AM, Nivek wrote: >> >> > 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. >> >> That is not true. > > > -- Romain Guy Android framework engineer romain...@android.com Note: please don't send private questions to me, as I don't have time to provide private support. All such questions should be posted on public forums, where I and others can see and answer them --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---
[android-developers] Re: out of memory error & getWallpaper
Ok, so I should replace my calls to ImageView.getDrawable().getBitmap ().recycle() with ImageView.setImageBitmap(null) and let the GC do his job ? Or is the call to ImageView.setCallback(null) enough to get rid of both ImageView and Bitmap instances ? I'll try to track all my calls to Bitmap.recycle() and better check where the references to these bitmaps are located. On 18 août, 00:51, Romain Guy wrote: > Bitmap are eventually garbage collected. From the javadoc of the > Bitmap class itself: > > "This is an advanced call, and normally need > not be called, since the normal GC process will free up this memory when > there are no more references to this bitmap." > > > > > > On Mon, Aug 17, 2009 at 3:14 PM, Nivek wrote: > > > I'm sorry, I've certainly misunderstood something then, but... while > > coding an app dealing with bitmaps, this is what it looks like. > > Reading posts and blogs about memory management and use of bitmap led > > me to that conclusion, and carefully recycling bitmaps in my app > > allowed me to get rid of a lot of memory allocation exceptions. > > > Anyway, about memory leaks on orientation changes, another blog post > > from Romain Guy could be useful: > >http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-andr... > > > You might try this Drawable.setCallback(null) trick... > > > On 17 août, 22:02, Marco Nelissen wrote: > >> On Mon, Aug 17, 2009 at 7:53 AM, Nivek wrote: > > >> > 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. > > >> That is not true. > > -- > Romain Guy > Android framework engineer > romain...@android.com > > Note: please don't send private questions to me, as I don't have time > to provide private support. All such questions should be posted on > public forums, where I and others can see and answer them --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~--~~~~--~~--~--~---