Bitmap is recycled but I didn't do it?

by William » Sat, 07 Mar 2009 10:53:20 GMT


Sponsored Links
 I am drawing bitmaps left and right and I hit this issue where I
create a bitmap in one section of my code and when I later try to draw
on it using canvas, i get bitmap recycled.  but I did not null if out,
or call its recycle method.

Description:

I have a main Class that extends View that when first loads, initiates
the main screen which loads/draws on bitmaps and no problem.  I then
added a key event that causes this screen to go away and load the next
screen.  The screen logic is encapsulated in a class that I already
instantiated in the Main Class constructor and in my second screen its
constructor is this code:

staticBg = new BitmapDrawable(Bitmap.createBitmap(320, 240,
Bitmap.Config.RGB_565));
staticGr = new Canvas( staticBg.getBitmap() );

at a later time, from my first screen when I push a button, i call my
init() function that trys load screen two which does a draw to this
bitmap and I get the following error:

03-06 08:52:56.301: ERROR/AndroidRuntime(846):
java.lang.NullPointerException
03-06 08:52:56.301: ERROR/AndroidRuntime(846):     at
android.graphics.Canvas.throwIfRecycled(Canvas.java:890)
03-06 08:52:56.301: ERROR/AndroidRuntime(846):     at
android.graphics.Canvas.drawBitmap(Canvas.java:911)

It is saying my bitmap is recycled BUT from what I understand that
does not happened unless you explicitly call it or the garbage
collector does when there are no more references to it BUT i obviously
still have a reference to it.  What am I doing wrong?

--~--~---------~--~----~------------~-------~--~----~



Bitmap is recycled but I didn't do it?

by Marco Nelissen » Sun, 08 Mar 2009 00:37:11 GMT


 



Are you sure it's your bitmaps it's complaining about, and not some
other bitmap?
Are you using the drawing cache in any way?

--~--~---------~--~----~------------~-------~--~----~


Sponsored Links


Bitmap is recycled but I didn't do it?

by Stoyan Damov » Sun, 08 Mar 2009 00:49:19 GMT


 BTW, the Android engineer who wrote the throwIfRecycled method should
be lynched. I understand that it saves an "if", as in:

if (bitmap.isRecycled()) throw ...

but s/he didn't even implement it defensively enough and the method
crashes if passed a null pointer.

Now, you either make the method super safe so it checks for both a
null pointer and whether the bitmap is recycled, or you let the user's
code crash miserably (preferred).
I will *very* much appreciate a Canvas::drawBitmapFast() or
drawBitmapUnsafe() method which doesn't check anything, because the
current implementation of drawBitmap(Bitmap, Paint) spends as much as
9%!!!!! in throwIfRecycled, which IMVHO is unacceptable.

Cheers





--~--~---------~--~----~------------~-------~--~----~



Bitmap is recycled but I didn't do it?

by Jean-Baptiste Queru » Sun, 08 Mar 2009 01:27:26 GMT


 e'll gladly accept high-quality contributions to optimize this.

JBQ

On Sat, Mar 7, 2009 at 8:49 AM, Stoyan Damov <stoyan.da...@gmail.com> wrote:



--
Jean-Baptiste M. "JBQ" Queru
Android Engineer, Google.

Questions sent directly to me that have no reason for being private
will likely get ignored or forwarded to a public forum with no further
warning.

--~--~---------~--~----~------------~-------~--~----~



Bitmap is recycled but I didn't do it?

by clark » Sun, 08 Mar 2009 01:49:32 GMT


 gt; BTW, the Android engineer who wrote the throwIfRecycled method should

Lynched??? Really. Wow, that would be a little excessive, don't you
think? I understand your frustration with the implementation of the
throwIfRecylced method, but to say the engineer should be lynched is
just ridiculous. Perhaps stopping to read your post prior to hitting
"send" would not be a bad idea. I think there are more tactful ways
of addressing issues than to attack the google developers. An OS and
the accompanying Framework are no small project, and I think most of
us realized there would be issues along the way, especially with the
hardware being released with a 1.0 SDK.

Long story short, be careful not to bite off the hand that feeds you.
Okay google isn't feeding you, but they have produced something that
has great potential, and as a community we need to come together and
help out in any which way we can.

And as JBQ said, if you have a better implementation send it on up to
the google guys to review and possibly implement.


~clark

On Mar 7, 8:49am, Stoyan Damov <stoyan.da...@gmail.com> wrote:
--~--~---------~--~----~------------~-------~--~----~



Bitmap is recycled but I didn't do it?

by William » Sun, 08 Mar 2009 02:14:50 GMT


 well it happens either way: if I call or.  I used a breakpoint right
at the line and it bombs when the line gets executed so I know its
that bitmap.

    private BitmapDrawable staticBg;
    private Canvas staticGr;

both throw the error

staticBg.draw(g);
OR
 g.drawBitmap(staticBg.getBitmap(),0, 0, null);

anymore ideas?

Its really annoying. what makes it be recycled.  even if it was
another bitmap, i do not call recycle on any of my bitmaps so that
means the GC has to get to them which makes no sense since I still
have references to the object it should not get them.





--~--~---------~--~----~------------~-------~--~----~



Bitmap is recycled but I didn't do it?

by Romain Guy » Sun, 08 Mar 2009 03:38:22 GMT


 gt; but s/he didn't even implement it defensively enough and the method

It would crash without the test to see if it's recycled. Passing a
null will Bitmap will crash, period. The reason why there's a check
for recycled and not for null is that a crash due to a recycled Bitmap
would be much more difficult to debug/understand without the "recycled
exception."




--
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

--~--~---------~--~----~------------~-------~--~----~



Bitmap is recycled but I didn't do it?

by Stoyan Damov » Sun, 08 Mar 2009 06:52:43 GMT


 n Sat, Mar 7, 2009 at 7:49 PM, clark <clarkd...@gmail.com> wrote:

You can't possibly think that I *meant* that the guy should be
lynched, right? It's an expression of frustration. If an engineer were
lynched for 1 bug there wouldn't be any of us :)

It's not that I don't understand what an enormous effort an OS and a
framework is, my frustration comes from the fact that Google have
published performance guidelines for app developers but in this case
(which btw is quite a hot spot if you're developing a game and most of
the app's time is spent in drawing) they've chosen a shortcut and
instead of doing a direct check are calling a method
(throwIfRecycled), which in turns calls another method (isRecycled)
and could easily spare both calls (or at least one):

1. throwIfRecycled is absolutely not needed - they can call isRecycled
directly in an if statement in drawBitmap

2. isRecycled is not needed as well. To answer Romain's post -
drawBitmap_native or whatever the JNI method is called could check
whether the bitmap is recycled or not, and surely faster than Java
would (i.e. checking a bit or comparing against an invalid handle
value or whatever the native implementation uses).


So I can't criticize if they've done something wrong, huh? I know I'm
probably the grumpiest ranting dev on the list but I just can help it
when I see something as obviously wrong as that.


Well, it's not that I'm suggesting they implement drawBitmap in some
fundamentally different and optimized way, is it? It's just replacing
2 method calls with 1 "if" and a method call.


--~--~---------~--~----~------------~-------~--~----~



Bitmap is recycled but I didn't do it?

by Marco Nelissen » Sun, 08 Mar 2009 09:45:14 GMT


 


That sounds like it shouldn't take much time to implement and test at
all, so we'll be expecting your patch by Monday :)

--~--~---------~--~----~------------~-------~--~----~



Other Threads

1. hTC Legend with Android 2.1 and Optical Mouse

Enjoying my new hTC Legend with OMALED LCD, Android 2.1 and Optical Mouse..
Very nice..

http://www.flickr.com/photos/31506...@n03/4340899244/
http://www.flickr.com/photos/31506...@n03/4340156931/

Enjoy..

-- 
"Indonesian Android Community [id-android]" 

2. Adjusting contents of ListView at runtime

On Mon, Feb 8, 2010 at 8:56 PM, Kasra Rahjerdi <johncena4presid...@gmail.com




Does you ListView have it's ID set correctly?
(android:id="@id/android:list")

-------------------------------------------------------------------------------------------------
TreKing - Chicago transit tracking app for Android-powered devices
http://sites.google.com/site/rezmobileapps/treking

-- 

3. SQlite error

4. Gathering, Official Tshirt id-android, WTI: Komunitas id-android di Majalah Mobile Guide hal 28

5. Adjusting contents of ListView at runtime

6. Salam kenal dan bintil2

7. Closed WTPinjemin: Telkomsel Flash unlimited