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 <[email protected]> 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 <[email protected]> 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 <[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)- Hide quoted text -
> >
> > - Show quoted text -
> >
>


-- 
Dianne Hackborn
Android framework engineer
[email protected]

Note: please don't send private questions to me, as I don't have time to
provide private support, and so won't reply to such e-mails.  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 [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
-~----------~----~----~----~------~----~------~--~---

Reply via email to