On Sat, Mar 7, 2009 at 7:49 PM, clark <[email protected]> wrote:
>
>> BTW, the Android engineer who wrote the throwIfRecycled method should
>> be lynched. I understand that it saves an "if", as in:
>
> 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.

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

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

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.

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

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.

>
>
> ~clark
>
> On Mar 7, 8:49 am, Stoyan Damov <[email protected]> wrote:
>> 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
>>
>> On Sat, Mar 7, 2009 at 6:37 PM, Marco Nelissen <[email protected]> wrote:
>>
>> > On Fri, Mar 6, 2009 at 5:59 AM, William <[email protected]> wrote:
>>
>> >> 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?
>>
>> > 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?
> >
>

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